PHP性能優化

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

作爲以PHP爲開發語言的應用程序而言,PHP程序的性能能影響到整個架構性能的百分之30左右,不會超過百分之50,其餘的是硬件的、操作系統的、存儲的等等其他性能優化;因此,PHP程序的性能好壞,對於整個系統架構而言,還是很重要的。

PHP的性能優化分爲一下三個層次:

這三個層次性能優化的難度依次上升,效果卻依次降低。在此,我們重點討論前兩種層次。

PHP代碼的優化

多使用PHP內置的函數,少使用PHP代碼,且精簡PHP代碼

PHP的執行流程爲:

這個原理是很簡單的,PHP是解釋型語言,PHP代碼得經過好幾步轉化才能變成最終的機器碼,假如PHP代碼寫的很多,不夠精簡,轉化的步驟就會變長,自然會影響PHP程序的性能。而PHP內置的函數是由C語言編寫的,運行速度自然快。

PHP內置函數的執行效率也有優先級,可以儘量使用快的

這個原因也是顯而易見的,雖然都是C語言寫的程序,但是C實現的方式還是不同的,有的實現方式快一些,有的實現的慢一些,所以調用快的效率肯定會高一點。
例如:

  • array_key_exists效率要比in_array
  • requirerequire_once效率高
  • 單引號''比雙引號""效率高

減少PHP魔法函數的使用

PHP的魔法函數用起來很爽,但是既然用的這麼爽,那麼PHP在底層肯定幫你做了諸多事情,做的這麼一堆事情,不能不消耗性能吧。
PHP魔法函數爲了讓程序員爽,在語言級別幫程序猿做了很多,會帶啦性能開銷,我們應該看情況酌情使用。

不要使用錯誤抑制符@

@錯誤抑制符這玩意兒的實現原理和魔法函數差不多,都是方便了程序猿苦了自己;原理也很簡單,就是在添加了錯誤@符號的前面和後面添加了Opcode,Opcode的作用就是和error_reporting忽略錯誤一樣一樣的,然後在添加了@符號的代碼之後再添加上一些Opcode,將錯誤等級恢復。

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

合理使用PHP內存,釋放掉沒用的變量

要儘量合理的使用內存,例如:

  • 從數據庫中取字段,只取某個字段,就不要取出全部字段。 select xxx 和 select * 的區別
  • 讀取文件,文件使用完後,文件close的問題
  • 使用unset及時釋放掉無用的變量。(但是也會有unset不掉的情況)

儘量減少使用正則表達式

正則表達式需要回溯,當正則表達式越長,它回溯的開銷就會越大,優化表達式也是個技術活兒,所以建議儘量使用PHP內置的處理函數來替代。

避免循環內做重複的計算

例如:

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

strlen($str)是不是被重複計算了?有意義嗎?寫在外邊不好嗎?

避免數據密集型計算

PHP是由C語言來實現的,PHP本身在處理一些計算的時候,額外的開銷是很大的,例如它的變量寄存、語言處理,都需要C來實現…PHP的“慢”,不是由於一些特性而“慢”,是整體就慢。所以在處理一些大批量數據例如大批量日誌處理,大批量數據分析的時候,是十分不適合的,和C等語言比起來不是一個數量級。

PHP的語言特性決定了PHP不適合做大數據量的計算。
PHP適合做的事:

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

使用Opcode cache

Opcode是整個PHP中最接近機器碼的地方,假如我們對Opcode做一下緩存,就節約了PHP代碼解析、編譯的開銷,在此,我們可以使用一些擴展來對Opcode進行緩存

  • APC。(已經不更新)
  • 鳥哥的yac

PHP周邊性能優化

以上就是PHP周邊的環境。只有PHP周邊的環境也得到了很好的性能優化,才能將PHP的系統架構發揮到極致。

不要使用過多的IO

PHP場景的性能開銷次序爲:讀取內存 < 讀取數據庫 < 讀取文件 < 讀取網絡數據

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

優化網絡請求

設置超時時間

  • 連接超時 200ms
  • 讀超時 800ms
  • 寫超時 500ms

將串行請求並行化

  • 使用curl_multi_*()的函數代替curl
  • 使用swoole擴展(比 curl_multi還要好)

合理的將PHP接口輸出壓縮

使用gzip可以將PHP接口輸出壓縮,提高我們的IO,但是壓縮的過程需要額外的計算消耗,需要消耗部分CPU性能,需要合理使用;當數據量小於幾十kb的時候,用gzip還不如不用,當gzip數據大於100k的時候,壓縮是合理的,而且壓縮的程度還和數據重複的個數有關,如果重複的多,gizp就壓縮的小,如果重複的少,gzip壓縮的就稍微大點兒。

最後的解決方案

使用性能優化分析工具

  • Facebook的XHPorf
  • 壓力測試工具Apache的ab
  • opcode代碼分析工具vld

用PHP擴展代替部分邏輯

這個不用多說,很多大公司都是這麼做的。
把很多PHP的library做成.so文件。

使用PHP7

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

更多精彩內容,請關注我的微信公衆號 互聯網技術窩 或者加微信共同探討交流:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章