這是在慕課網上《性能優化之php》記下來的筆記,防止遺忘。
一、語言級性能優化
1、優化點:少寫代碼,多用PHP自身能力
1)性能問題:自寫代碼冗余較多,可讀性不佳,并且性能低
2)為甚么性能低:PHP代碼需要編譯解析成為底層語言,這一過程每次請求都會處理一邊,開銷大
3)好的方法:多使用PHP內置函數、變量、常量
例如array_merged,數組合并,先插入數組1,然后數組2插入,先判斷元素是否存在,存在則忽略,否則插入
2、優化點:PHP內置函數的性能優劣
1)情況描述:PHP內置函數,之間依然存在快慢差異
2)好的建議:多去了解PHP內置函數的時間復雜度
3)isset()和array_key_exists()方法間的性能差異
3、優化點:盡可能少用魔法函數
1)情況描述:PHP提供的魔法函數,性能不佳
2)為什么性能低:為了給PHP程序員省事
3)好的方法:盡可能規避使用PHP魔法函數
4、優化點:產生額外開銷的錯誤抑制符
1)情況描述:PHP提供的錯誤抑制符只是為了方便懶人
2)@的實際邏輯:在代碼開始前、結束后,增加opcode,忽略報錯;
vId-PHP Opcode查看擴展:顯示Opcode的信息顯示出來
5、優化點:合理使用內存
1)情況描述:PHP有內存回收機制保底,但也請小心使用內存
2)好的建議:利用unset()及時釋放不使用的內存(注:unset()出現注銷不掉的情況)
6、優化點:盡量少的使用正則表達式
1)情況描述:正則表達式的回溯開銷較大
2)好的建議:利用字符串處理函數,實現相同邏輯
7、優化點:避免在循環內做運算
1)情況描述:循環內的計算式將會被重復計算
2)別在for中計算count
8、優化點:減少計算密集型業務
1)情況描述:PHP不適合密集型運算的場景
2)為什么?PHP語言特性決定了PHP不適合做大數據運算(底層語言為C)
3)適用場景:適合銜接WebServer與后端服務、UI呈現
9、優化點:務必使用帶引號字符串做鍵值
1)情況描述:PHP會將沒有引號的鍵值當做常值,產生查找常量的開銷
2)好的建議:嚴格使用引號作為鍵值
二、周邊性能優化
Linux環境、PHP、硬盤、數據庫、內存(緩存基于內存)、網絡
DB和PHP 運行環境可以忽略,很可能是網絡耗時與數據庫操作耗時
1、減少文件類操作
1)常見PHP常見的開銷次序:讀寫磁盤、讀寫數據庫、讀寫內存、讀寫網絡數據
2)讀寫內存(因為PHP直接通過引擎讀取內存)<<讀寫數據庫(數據庫基于本地磁盤,但一般會使用熱內存,緩存在內存中,異步寫入磁盤)<<讀寫磁盤<<讀寫網絡數據(socket,網絡延遲)
2、減少PHP發起請求
1)優化網絡請求
坑:對方接口的不確定因素、網絡穩定性
2)方法:
設置超時時間:a)連接超時——不超過200ms;b)讀超時——不超過800ms,最多不能大于1s多;c)寫超時——不超過500ms
將串行請求并行化:a)使用curl_multi_*(),注意當使用curl_multi_exec時,多個請求同時發起,但返回時間依賴于最長的那個請求時間,這是最簡單但不是最好的;b)使用swoole擴展,推薦這個
3、壓縮PHP輸出的利與弊
1)如何壓縮?
使用Gzip即可
2)利:利于數據輸出,client端能更快獲取數據
弊:壓縮使服務端和客戶端都額外的CPU開銷(業務龐大的時候出現問題),當我們的數據小于幾十K的時候,壓縮效果不理想,若大于100K,則可以壓縮會幾十K
4、PHP緩存復用
1)什么情況下做輸出內容的緩存:
多次請求,內容不變的情況
流程:X.php先查看cache,如果命中,則返回cache,否則進行計算、數據處理進入cache再返回
5、smarty調優和重疊時間窗口思想
1)Smarty開啟caching
2)重疊時間窗口思想
三、PHP性能分析
1、工具XHProf(源自于Facebook的php性能分析工具)
1)php —ri xhprof檢查擴展是否安裝
xhprof_enable();
….
$data = xhprof_disable();//返回性能分析
include_once xhprof_lib.php;
include_once xhprof_runs.php;
$objXhprofRun = new XHProfRuns_Default();
$run_id = $objXhprofRun->save_run($data,”test”);
var_dump($run_id);
xhp,可以查看性能數據
Incl. Wall Time表示我以及我之后的所有方法的耗時
Excl Wall Time表示我的耗時
ctrl+u查看源代碼
其他推薦工具
ab——壓力測試
vId——opcode代碼分析
四、PHP性能瓶頸解決方法
1、opcode cache:PHP擴展APC
2、pecl.php.net
3、擴展實現:通過PHP擴展代替原PHP代碼中高頻邏輯
4、runtime優化:HHVM(后來發力不足)