PHP 效能問題通常不超過系統總瓶頸的 30%-40%,但對高併發場景至關重要。本文從語言層面、週邊服務、語言內核三個維度,系統梳理 PHP 效能優化的核心策略與實戰技巧。
問題:自寫代碼冗餘、可讀性差,每次請求都需編譯解析為底層指令,開銷大。
策略:優先使用 PHP 內建變數、常數、函數(如 array_map、array_filter、json_encode 等),它們以 C 實現,效能遠超用戶代碼。
同功能函數間存在顯著效能差異。例如:
isset() > array_key_exists() > in_array()(查鍵 vs 查值)strtr() > str_replace() > preg_replace()(字串替換)json_decode() 比 unserialize() 慢,但更安全通用建議:建立常用函數效能心智模型,關鍵路徑優先選擇高效函數。
__get、__set、__call、__autoload 等魔術方法為了開發便利犧牲了效能。關鍵路徑(如模型層頻繁存取屬性)應改用顯式方法或屬性存取。
@ 運算符實際邏輯:暫時將錯誤報告級別設為最高,執行完再恢復,增加 Opcode 開銷。嚴禁在迴圈或高頻路徑使用,改用條件判斷或 error_get_last() 處理預期錯誤。
unset() 釋放unset() 僅刪除變數引用,底層記憶體需等 GC 回收yield 處理大量資料流,避免一次性載入陣列回溯開銷大,「沒有金剛鑽別攬瓷器活」。能用 strpos、substr、explode、str_replace 解決的堅決不用正則。必須用時:
(a+)+)// ❌ 錯誤:每次迴圈都呼叫 strlen()
for ( $i = 0; $i < strlen( $str ); $i++ ) { ... }
// ✅ 正確:預先計算長度
$len = strlen( $str );
for ( $i = 0; $i < $len; $i++ ) { ... }
PHP 不適合大數據量運算(圖像處理、機器學習、複雜加密)。策略:
php-ffmpeg、imagick、sodium)// ❌ 無引號:PHP 先嘗試解析為常數,再當作字串 $arr[key] = 'value'; // ✅ 有引號:直接當作字串鍵值 $arr['key'] = 'value';
記憶體讀寫 << 資料庫讀寫 < 磁碟讀寫 < 網路請求
痛點:對方介面不穩、網路抖動、無回應阻塞。
策略:
curl_multi_*() 原生並行Co::wait() / Co\Channelob_start('ob_gzhandler') 或 Nginx gzipPHP 5.5+ 內建 OPcache,將編譯後的 Opcode 存入共享記憶體,省去每次請求的編譯階段。
關鍵設定(php.ini):
opcache.enable=1 opcache.memory_consumption=256 opcache.max_accelerated_files=20000 opcache.revalidate_freq=60 opcache.validate_timestamps=1 ; 開發環境 0,生產 1
ab -n 1000 -c 100 https://target/(-n 總請求數,-c 併發數)PHP 效能優化是系統工程,而非單點技巧。建立「測量→分析→優化→驗證」閉環,持續迭代,才能在業務增長中保持系統穩定高效。