PHP7通過(guò)yum源安裝及性能測(cè)試

提到PHP,肯定會(huì)有人說(shuō)這是世界上最好的編程語(yǔ)言。單說(shuō)流行程度,目前全球超過(guò)81.7%的服務(wù)器后端都采用了PHP語(yǔ)言,它驅(qū)動(dòng)著全球超過(guò)2億多個(gè)網(wǎng)站。上月初PHP7正式版發(fā)布,迎來(lái)自2004年以來(lái)最大的版本更新?,F(xiàn)在PHP 7.0正式發(fā)布。

對(duì)于普通的PHP網(wǎng)站,主要是IO密集型的,瓶頸在MySQL數(shù)據(jù)之上,體現(xiàn)不出來(lái)PHP性能的劣勢(shì)。但在密集計(jì)算方面比C、C++、Java這種靜態(tài)編譯型語(yǔ)言差幾十倍甚至上百倍。如果在PHP開發(fā)中使用了比較復(fù)雜的框架,如symfony,程序性能會(huì)明顯下降。事實(shí)上,PHP語(yǔ)言最初的設(shè)計(jì),就不是用來(lái)解決計(jì)算密集型的應(yīng)用場(chǎng)景。我們可以這樣粗略理解為,PHP為了提升開發(fā)效率,而犧牲了執(zhí)行效率。

但PHP比較流行,如新浪微博、Facebook這種大型網(wǎng)站大部分程序都是使用PHP寫的,也就是在這種大規(guī)模應(yīng)用下,PHP性能低下就顯現(xiàn)出來(lái)了。Facebook早期的很多代碼是使用PHP來(lái)開發(fā)的,但是,隨著業(yè)務(wù)的快速發(fā)展,PHP執(zhí)行效率成為越來(lái)越明顯的問(wèn)題。為了優(yōu)化執(zhí)行效率,F(xiàn)acebook在2008年就開始使用HipHop,這是一種PHP執(zhí)行引擎,最初是為了將Fackbook的大量PHP代碼轉(zhuǎn)成 C++,以提高性能和節(jié)約資源。使用HipHop的PHP代碼在性能上有數(shù)倍的提升。后來(lái),F(xiàn)acebook將HipHop平臺(tái)開源,逐漸發(fā)展為現(xiàn)在的HHVM。HHVM用來(lái)替換PHP自身使用的引擎Zend Engine。據(jù)說(shuō)性能提升了70%。當(dāng)然PHP官方也知道PHP最大的短板,于是推出了PHP7項(xiàng)目,主要是重構(gòu)了Zend Engine引擎。

PHP7最顯著的變化就是性能的極大提升,已接近Facebook開發(fā)的PHP執(zhí)行引擎HHVM。在WordPress基準(zhǔn)性能測(cè)試中,速度比5.6版本要快2~3倍,大大減少了內(nèi)存占用。PHP7在語(yǔ)言上也有一些變化,比如添加返回類型聲明、增加了一些新的保留關(guān)鍵字等。在安全方面,去除了PHP安全模式,添加魔術(shù)引號(hào)等。不僅如此,新版還支持64位,而且包含最新版Zend引擎。其實(shí)PHP7的在真實(shí)場(chǎng)景的性能確實(shí)已經(jīng)和HHVM相當(dāng),在一些場(chǎng)景甚至超過(guò)了HHVM。但HHVM的運(yùn)維復(fù)雜, 是多線程模型, 這就代表著如果一個(gè)線程導(dǎo)致crash了, 那么整個(gè)服務(wù)就掛了, 并且它不會(huì)自動(dòng)重啟。另外它采用JIT, 那么意味著, 重啟以后要預(yù)熱, 沒(méi)有預(yù)熱的情況下, 性能較為糟糕。并且多線程模型調(diào)試?yán)щy, 這對(duì)于追求穩(wěn)定來(lái)說(shuō)的Web服務(wù)來(lái)說(shuō), 是非常不適合的。

YUM安裝PHP7

想使用最新版PHP,就需要使用到REMI源,Remi repository是包含最新版本PHP和MySQL包的Linux源,由Remi提供維護(hù)。有個(gè)這個(gè)源之后,使用YUM安裝或更新PHP、MySQL較新版本了。

安裝最新的Remi源自動(dòng)安裝文件

#CentOS6 / 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相關(guān)組件,下面提供的是一個(gè)生產(chǎn)環(huán)境中可以使用的標(biāo)配安裝。

$ 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 )

啟動(dòng)PHP-FPM

$ service php-fpm start

到這里,PHP7.0就安裝完成了。如果需要用到PHP擴(kuò)展功能,如redis、memcached等,只需要也使用YUM安裝即可,如下:

$ yum --enablerepo=remi,remi-php70 install php-redis php-memcached

如果在REMI或EPEL源中都找不到你需要的擴(kuò)展模塊,那么就需要手動(dòng)編譯安裝了,也很簡(jiǎn)單。

另外查看PHP模塊信息使用php -m命令。

$ php -m | grep redis

redis

安裝一套LNMP參考:LNMP安裝包部署實(shí)戰(zhàn)或者參考PHP7.0版本的LNMPZabbix 3.0安裝使用詳解

PHP7性能測(cè)試

環(huán)境:4核 CPU,內(nèi)存4G,操作系統(tǒng)Centos 6.5。

首先說(shuō)一點(diǎn)GCC編譯器的建議,據(jù)鳥哥建議,使用新一點(diǎn)的編譯器,推薦 GCC 4.8以上,因?yàn)橹挥蠫CC 4.8以上PHP才會(huì)開啟Global Register for opline and execute_data支持, 這個(gè)會(huì)帶來(lái)5%左右的性能提升。

寫一段程序(網(wǎng)上提供的簡(jiǎn)單測(cè)試方法):

第一段,生成一個(gè) 60 萬(wàn)元素的數(shù)組,通過(guò)查找key 的方式,來(lái)確定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`

響應(yīng)時(shí)間在PHP7下運(yùn)行變?yōu)樵瓉?lái)的1/4。

還是上面的這個(gè)方式,不過(guò)由于速度較慢,所以變成了一個(gè)60000個(gè)元素的數(shù)組,查找值。

< ?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

等待的時(shí)間,總是覺(jué)得很漫長(zhǎng),三次測(cè)試,花掉了75秒多。下面,PHP 7 登場(chǎng)了。

[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

有沒(méi)有!速度整整提高了將近7倍。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容