PHP7與HHVMphp
提到PHP,確定會有人說這是世界上最好的編程語言。單說流行程度,目前全球超過81.7%的服務器後端都採用了PHP語言,它驅動着全球超過2億多個網站。上月初PHP7正式版發佈,迎來自2004年以來最大的版本更新。如今PHP 7.0正式發佈。mysql
對於普通的PHP網站,主要是IO密集型的,瓶頸在MySQL數據之上,體現不出來PHP性能的劣勢。但在密集計算方面比C、C++、Java這種靜態編譯型語言差幾十倍甚至上百倍。若是在PHP開發中使用了比較複雜的框架,如symfony,程序性能會明顯降低。事實上,PHP語言最初的設計,就不是用來解決計算密集型的應用場景。咱們能夠這樣粗略理解爲,PHP爲了提高開發效率,而犧牲了執行效率。linux
但PHP比較流行,如新浪微博、Facebook這種大型網站大部分程序都是使用PHP寫的,也就是在這種大規模應用下,PHP性能低下就顯現出來了。Facebook早期的不少代碼是使用PHP來開發的,可是,隨着業務的快速發展,PHP執行效率成爲愈來愈明顯的問題。爲了優化執行效率,Facebook在2008年就開始使用HipHop,這是一種PHP執行引擎,最初是爲了將Fackbook的大量PHP代碼轉成 C++,以提升性能和節約資源。使用HipHop的PHP代碼在性能上有數倍的提高。後來,Facebook將HipHop平臺開源,逐漸發展爲如今的HHVM。HHVM用來替換PHP自身使用的引擎Zend Engine。聽說性能提高了70%。固然PHP官方也知道PHP最大的短板,因而推出了PHP7項目,主要是重構了Zend Engine引擎。redis
PHP7最顯著的變化就是性能的極大提高,已接近Facebook開發的PHP執行引擎HHVM。在WordPress基準性能測試中,速度比5.6版本要快2~3倍,大大減小了內存佔用。PHP7在語言上也有一些變化,好比添加返回類型聲明、增長了一些新的保留關鍵字等。在安全方面,去除了PHP安全模式,添加魔術引號等。不只如此,新版還支持64位,並且包含最新版Zend引擎。其實PHP7的在真實場景的性能確實已經和HHVM至關,在一些場景甚至超過了HHVM。但HHVM的運維複雜, 是多線程模型, 這就表明着若是一個線程致使crash了, 那麼整個服務就掛了, 而且它不會自動重啓。另外它採用JIT, 那麼意味着, 重啓之後要預熱, 沒有預熱的狀況下, 性能較爲糟糕。而且多線程模型調試困難, 這對於追求穩定來講的Web服務來講, 是很是不適合的。sql
YUM安裝PHP7編程
想使用最新版PHP,就須要使用到REMI源,Remi repository是包含最新版本PHP和MySQL包的Linux源,由Remi提供維護。有個這個源以後,使用YUM安裝或更新PHP、MySQL較新版本了。json
安裝最新的Remi源自動安裝文件後端
# CentOS 6 / RHEL 6 yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm # CentOS 7 / RHEL 7 yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
安裝PHP相關組件,下面提供的是一個生產環境中可使用的標配安裝。數組
$ yum --enablerepo=remi,remi-php70 install php \ php-cgi \ php-cli \ php-fpm \ php-common \ php-devel \ php-mysqlnd \ php-mysql \ php-sqlite3 \ php-mbstring \ php-msgpack \ php-mcrypt \ php-bcmath \ php-gd \ php-xml \ php-ldap \ php-xmlrpc \ php-opcache \ php-curl \ php-json \ php-odbc \ php-pdo \ php-bz2 \ php-xml \ php-ftp \ php-imap \ php-snmp \ php-redis \ php-memcached
查看PHP版本安全
$ php -v PHP 7.0.9 (cli) (built: Jul 20 2016 18:08:08) ( NTS )
啓動PHP-FPM
$ service php-fpm start
到這裏,PHP7.0就安裝完成了。若是須要用到PHP擴展功能,如redis、memcached等,只須要也使用YUM安裝便可,以下:
$ yum --enablerepo=remi,remi-php70 install php-redis php-memcached
若是在REMI或EPEL源中都找不到你須要的擴展模塊,那麼就須要手動編譯安裝了,也很簡單。
另外查看PHP模塊信息使用php -m命令。
$ php -m | grep redis redis
安裝一套LNMP參考:LNMP安裝包部署實戰或者參考PHP7.0版本的LNMPZabbix 3.0安裝使用詳解
PHP7性能測試
環境:4核 CPU,內存4G,操做系統Centos 6.5。
首先說一點GCC編譯器的建議,據鳥哥建議,使用新一點的編譯器,推薦 GCC 4.8以上,由於只有GCC 4.8以上PHP纔會開啓Global Register for opline and execute_data支持, 這個會帶來5%左右的性能提高。
寫一段程序(網上提供的簡單測試方法):
第一段,生成一個 60 萬元素的數組,經過查找key 的方式,來肯定key是否存在。
< ?php $a = array(); for($i=0;$i<600000;$i++){ $a[$i] = $i; } foreach($a as $i) { array_key_exists($i, $a); }
首先是PHP 5.3.17版。
[root@localhost test]# time php search_by_key.php real 0m0.389s user 0m0.337s sys 0m0.051s [root@localhost test]# time php search_by_key.php real 0m0.378s user 0m0.308s sys 0m0.062s [root@localhost test]# time php search_by_key.php real 0m0.378s user 0m0.317s sys 0m0.061s
其次是PHP 7.0版本。
[root@localhost php7]# time php7 search_by_key.php real 0m0.082s user 0m0.066s sys 0m0.014s [root@localhost php7]# time php7 search_by_key.php real 0m0.080s user 0m0.058s sys 0m0.021s [root@localhost php7]# time php7 search_by_key.php real 0m0.080s user 0m0.053s sys 0m0.026s`
響應時間在PHP7下運行變爲原來的1/4。
仍是上面的這個方式,不過因爲速度較慢,因此變成了一個60000個元素的數組,查找值。
< ?php $a = array(); for($i=0;$i<600000;$i++){ $a[$i] = $i; } foreach($a as $i) { array_key_exists($i, $a); } [root@localhost test]# time php search_by_val.php real 0m24.296s user 0m24.184s sys 0m0.025s [root@localhost test]# time php search_by_val.php real 0m25.523s user 0m25.317s sys 0m0.026s [root@localhost test]# time php search_by_val.php real 0m26.026s user 0m25.478s sys 0m0.092s
等待的時間,老是以爲很漫長,三次測試,花掉了75秒多。下面,PHP 7 登場了。
[root@localhost php7]# time php7 search_by_val.php real 0m3.362s user 0m3.323s sys 0m0.007s [root@localhost php7]# time php7 search_by_val.php real 0m3.266s user 0m3.251s sys 0m0.004s [root@localhost php7]# time php7 search_by_val.php real 0m3.290s user 0m3.275s sys 0m0.006s
有沒有!速度整整提升了將近7倍。