PHP 性能優(yōu)化

PHP雖然是世界上最好的語(yǔ)言,但是它本身作為一門腳本語(yǔ)言,其運(yùn)行效率一直被人們所詬病。

作為以PHP為開(kāi)發(fā)語(yǔ)言的應(yīng)用程序而言,PHP程序的性能能影響到整個(gè)架構(gòu)性能的百分之30左右,不會(huì)超過(guò)百分之50,其余的是硬件的、操作系統(tǒng)的、存儲(chǔ)的等等其他性能優(yōu)化;因此,PHP程序的性能好壞,對(duì)于整個(gè)系統(tǒng)架構(gòu)而言,還是很重要的。

PHP的性能優(yōu)化分為一下三個(gè)層次:

PHP.png

這三個(gè)層次性能優(yōu)化的難度依次上升,效果卻依次降低。在此,我們重點(diǎn)討論前兩種層次。

1. PHP代碼的優(yōu)化

多使用PHP內(nèi)置的函數(shù),少使用PHP代碼,且精簡(jiǎn)PHP代碼

PHP的執(zhí)行流程為:


php_flow.png

這個(gè)原理是很簡(jiǎn)單的,PHP是解釋型語(yǔ)言,PHP代碼得經(jīng)過(guò)好幾步轉(zhuǎn)化才能變成最終的機(jī)器碼,假如PHP代碼寫的很多,不夠精簡(jiǎn),轉(zhuǎn)化的步驟就會(huì)變長(zhǎng),自然會(huì)影響PHP程序的性能。而PHP內(nèi)置的函數(shù)是由C語(yǔ)言編寫的,運(yùn)行速度自然快。

PHP內(nèi)置函數(shù)的執(zhí)行效率也有優(yōu)先級(jí),可以盡量使用快的

這個(gè)原因也是顯而易見(jiàn)的,雖然都是C語(yǔ)言寫的程序,但是C實(shí)現(xiàn)的方式還是不同的,有的實(shí)現(xiàn)方式快一些,有的實(shí)現(xiàn)的慢一些,所以調(diào)用快的效率肯定會(huì)高一點(diǎn)。
例如:

  • array_key_exists效率要比in_array
  • requirerequire_once效率高
  • 單引號(hào)''比雙引號(hào)""效率高
減少PHP魔法函數(shù)的使用

PHP的魔法函數(shù)用起來(lái)很爽,但是既然用的這么爽,那么PHP在底層肯定幫你做了諸多事情,做的這么一堆事情,不能不消耗性能吧。
PHP魔法函數(shù)為了讓程序員爽,在語(yǔ)言級(jí)別幫程序猿做了很多,會(huì)帶啦性能開(kāi)銷,我們應(yīng)該看情況酌情使用。

不要使用錯(cuò)誤抑制符@

@錯(cuò)誤抑制符這玩意兒的實(shí)現(xiàn)原理和魔法函數(shù)差不多,都是方便了程序猿苦了自己;原理也很簡(jiǎn)單,就是在添加了錯(cuò)誤@符號(hào)的前面和后面添加了Opcode,Opcode的作用就是和error_reporting忽略錯(cuò)誤一樣一樣的,然后在添加了@符號(hào)的代碼之后再添加上一些Opcode,將錯(cuò)誤等級(jí)恢復(fù)。

可以用PHP的Opcode查看擴(kuò)展vld來(lái)查看添加了@符號(hào)的代碼情況。(vld的使用也很簡(jiǎn)單,就倆指令vld.active=1vld.execute=0., vld.active=1表示想要用擴(kuò)展,vld.execute=0.表示只是查看Opcode代碼,vld.execute=1.表示要執(zhí)行php程序。``php -vld.active=1 -vld.execute=0 xxx.php)

合理使用PHP內(nèi)存,釋放掉沒(méi)用的變量

要盡量合理的使用內(nèi)存,例如:

  • 從數(shù)據(jù)庫(kù)中取字段,只取某個(gè)字段,就不要取出全部字段。 select xxx 和 select * 的區(qū)別
  • 讀取文件,文件使用完后,文件close的問(wèn)題
  • 使用unset及時(shí)釋放掉無(wú)用的變量。(但是也會(huì)有unset不掉的情況)
盡量減少使用正則表達(dá)式

正則表達(dá)式需要回溯,當(dāng)正則表達(dá)式越長(zhǎng),它回溯的開(kāi)銷就會(huì)越大,優(yōu)化表達(dá)式也是個(gè)技術(shù)活兒,所以建議盡量使用PHP內(nèi)置的處理函數(shù)來(lái)替代。

避免循環(huán)內(nèi)做重復(fù)的計(jì)算

例如:

$str = "hello world";
for ($i = 0; $i<strlen($str); $i ++)
{
    //do something
}

strlen($str)是不是被重復(fù)計(jì)算了?有意義嗎?寫在外邊不好嗎?

避免數(shù)據(jù)密集型計(jì)算

PHP是由C語(yǔ)言來(lái)實(shí)現(xiàn)的,PHP本身在處理一些計(jì)算的時(shí)候,額外的開(kāi)銷是很大的,例如它的變量寄存、語(yǔ)言處理,都需要C來(lái)實(shí)現(xiàn)…PHP的“慢”,不是由于一些特性而“慢”,是整體就慢。所以在處理一些大批量數(shù)據(jù)例如大批量日志處理,大批量數(shù)據(jù)分析的時(shí)候,是十分不適合的,和C等語(yǔ)言比起來(lái)不是一個(gè)數(shù)量級(jí)。

PHP的語(yǔ)言特性決定了PHP不適合做大數(shù)據(jù)量的計(jì)算。
PHP適合做的事:

php_duty2222.png

PHP適合做一個(gè)紐帶,適合做一些字符串、文本處理。

使用Opcode cache

Opcode是整個(gè)PHP中最接近機(jī)器碼的地方,假如我們對(duì)Opcode做一下緩存,就節(jié)約了PHP代碼解析、編譯的開(kāi)銷,在此,我們可以使用一些擴(kuò)展來(lái)對(duì)Opcode進(jìn)行緩存

  • APC。(已經(jīng)不更新)
  • 鳥(niǎo)哥的yac。

2. PHP周邊性能優(yōu)化

php_around3333.png

以上就是PHP周邊的環(huán)境。只有PHP周邊的環(huán)境也得到了很好的性能優(yōu)化,才能將PHP的系統(tǒng)架構(gòu)發(fā)揮到極致。

不要使用過(guò)多的IO

PHP場(chǎng)景的性能開(kāi)銷次序?yàn)椋?code>讀取內(nèi)存 < 讀取數(shù)據(jù)庫(kù) < 讀取文件 < 讀取網(wǎng)絡(luò)數(shù)據(jù)

PHP是不適合編寫IO密集型的程序。

優(yōu)化網(wǎng)絡(luò)請(qǐng)求
設(shè)置超時(shí)時(shí)間
  • 連接超時(shí) 200ms
  • 讀超時(shí) 800ms
  • 寫超時(shí) 500ms
將串行請(qǐng)求并行化
  • 使用curl_multi_*()的函數(shù)代替curl
  • 使用swoole擴(kuò)展(比 curl_multi還要好)
合理的將PHP接口輸出壓縮

使用gzip可以將PHP接口輸出壓縮,提高我們的IO,但是壓縮的過(guò)程需要額外的計(jì)算消耗,需要消耗部分CPU性能,需要合理使用;當(dāng)數(shù)據(jù)量小于幾十kb的時(shí)候,用gzip還不如不用,當(dāng)gzip數(shù)據(jù)大于100k的時(shí)候,壓縮是合理的,而且壓縮的程度還和數(shù)據(jù)重復(fù)的個(gè)數(shù)有關(guān),如果重復(fù)的多,gizp就壓縮的小,如果重復(fù)的少,gzip壓縮的就稍微大點(diǎn)兒。

3. 最后的解決方案

使用性能優(yōu)化分析工具
  • Facebook的XHPorf
  • 壓力測(cè)試工具Apache的ab
  • opcode代碼分析工具vld
用PHP擴(kuò)展代替部分邏輯

這個(gè)不用多說(shuō),很多大公司都是這么做的。
把很多PHP的library做成.so文件。

使用PHP7

HHVM是由Facebook推出的,用來(lái)提升PHPruntime效率的,效果十分明顯。但是,就PHP7而言,官方覺(jué)得PHP7的engine更勝一籌,所以,如果想要整體提高性能,升級(jí)PHP7還是必要的。

?著作權(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)容

  • 1、用單引號(hào)代替雙引號(hào)來(lái)包含字符串,這樣做會(huì)更快一些。因?yàn)镻HP會(huì)在雙引號(hào)包圍的字符串中搜尋變量,單引號(hào)則不會(huì),注...
    紅魚(yú)綠魚(yú)與驢閱讀 1,133評(píng)論 0 3
  • 總體介紹: 一、規(guī)范說(shuō)明 性能是網(wǎng)站運(yùn)行是否良好的關(guān)鍵因素, 網(wǎng)站的性能與效率影響著公司的運(yùn)營(yíng)成本及長(zhǎng)遠(yuǎn)發(fā)展,編寫...
    henryspace閱讀 952評(píng)論 0 0
  • 1、如果能將類的方法定義成static,就盡量定義成static,它的速度會(huì)提升將近4倍。 2、$row['id'...
    紅魚(yú)綠魚(yú)與驢閱讀 235評(píng)論 0 0
  • 隨著孩子年齡的長(zhǎng)大,與父母之間的隔閡也變得越大。 關(guān)于孩子的隱私問(wèn)題,我不知道家長(zhǎng)怎么想的。每個(gè)人都需要自己的空...
    f7c64a05e8a9閱讀 430評(píng)論 1 2
  • 付出了一定要得到回報(bào),付出才有價(jià)值! 如果你去超市買東西,付了錢東西就不要了嗎?但是放在其他地方,則是過(guò)程很重要,...
    拂曉飛閱讀 316評(píng)論 1 0

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