* PHP性能問題 * 1.PHP語法使用的不恰當 * 2.使用PHP語言做了它不擅長的事 * 3.使用PHP語言鏈接的服務不給力 * 4.PHP自身做不了的事情 * * PHP的性能問題的解決方向 * 1.PHP語言級的性能優化(代碼優化) * 2.PHP周邊問題的性能優化(linux,mysql,磁盤等) * 3.PHP語言性能的優化(c層) * * 使用ab壓力測試(-n請求數 -c並發數 url目標壓測地址) * ./ab -n1000 -c100 http://www.baidu.com * Request per second每秒接受的請求數(越大越好) * Time per request一個請求需要的時間(越小越好) * * time php test.php 測試代碼執行時間 * * vld- PHP Opcode查看擴展 * php -dvld.active=1 -dvld.execute=0 test.php * * PHP代碼運行流程 * *.php(PHP文件)->Scanner(掃描代碼,分析)->Exprs(保存成zend引擎可以識別的文件)->Parser(解析)->Opcodes(能被執行的文件)->Exec(執行)->Output(輸出結果) * 多使用PHP內置變量,常量,函數 * php內置函數也存在差異,多使用時間復雜度低的.例isset()和array_key_exists()存在差異 * 盡可能規避使用PHP魔法函數 * 禁用@錯誤抑制符,會產生額外的開銷 * 合理使用內存,利用unset()及時釋放不使用的內存 * 盡量少使用正則表達式 * 避免在循環內做運算for($i=0;strlen($str);$i++){} * 減少計算密集型業務(php語言特性決定了PHP不適合做大數據量運算) * 務必使用帶引號字符串做鍵值(key) * 減少文件類操作 內存<<數據庫<磁盤<讀寫網絡數據 * 優化網絡:1.設置超時時間 連接超時200ms 讀超時800ms 寫超時500 2.將串行請求並行化:使用curl_multi_*() ,使用swoole擴展 * 壓縮PHP接口輸出:Gzip 好處:client更快獲取數據 壞處:額外的cpu開銷 * PHP緩存復用 * 時間窗口重疊方法 * PHP旁路方案 * xhprof (php -ri xhprof)