PHP 效能優化是系統工程,涵蓋語法細節、函數選擇、資料結構、快取策略、資料庫、伺服器配置、部署架構等多個維度。本文匯總 50+ 經實戰驗證的技巧,按「投入產出比」分級,助你精準定位瓶頸、避免過度優化。
opcache.enable=1,生產環境 opcache.validate_timestamps=0(部署時手動重啟/快取預熱)。gzip on / brotli on,文字資源壓縮 60-85%。Cache-Control: public, max-age=31536000, immutable,檔名含雜湊版本號。EXPLAIN、pt-query-digest,補足覆蓋索引,避免 SELECT *。Cache-Aside 模式。composer dump-autoload -o 生成 classmap,避免檔案系統查找。| 技巧 | 建議 | 原理/效能增益 |
|---|---|---|
| 字串引號 | 單引號優於雙引號 | 不解析變數,編譯/運行稍快 |
| 字串連接 | echo $a, $b 多參數 | 避免建立臨時字串,echo 是語言結構 |
| 遞增操作 | ++$i 優於 $i++ | 少 1 條 opcode,無臨時變數 |
| 陣列遍歷 | foreach 優於 for/while | 內部迭代器最佳化,無需 reset() |
| 陣列索引 | $arr['key'] 必加引號 | 無引號視為常數查找,慢 7 倍 |
| 內建函數 | 優先用內建函數 | C 實現,比用戶函數快數倍 |
| 字串替換 | strtr > str_replace > preg_replace | strtr 單次掃描,str_replace 多次掃描 |
| 錯誤抑制 | 禁用 @ 運算子 | 極大降低效能,改用條件判斷 |
| 變數預定義 | 循環外預定義大陣列/物件 | 避免重複記憶體分配/GC 壓力 |
| 釋放大變數 | unset($bigArray) 或賦值 null | 及時釋放記憶體,降低峰值 |
| 避免魔術方法 | 慎用 __get/__set/__call | 觸發額外查找,熱點路徑改用具體方法 |
| require_once | 改用 Composer 自動載入 | 避免重複 stat() 系統調用 |
| 絕對路徑 include | __DIR__ . '/file.php' | 避免遍歷 include_path |
| 時間獲取 | $_SERVER['REQUEST_TIME'] > time() | 避免系統調用,直接取請求開始時間 |
| 分支優化 | switch > 多層 if/elseif | 內部跳轉表,條件多時更快 |
| 正則能不用就不用 | 字串函數/解析器替代 | PCRE 開銷大,且易觸發回溯限制 |
LIMIT 100000, 20 → 游標式 WHERE id > $lastId LIMIT 20。with() / join / 批次載入關聯。select('id,name') 而非 select('*')。INSERT ... VALUES (...), (...), ... 單條 SQL 寫入千條記錄。| 方向 | 技術/工具 | 適用場景 | 複雜度 |
|---|---|---|---|
| 非同步處理 | Swoole / Workerman / RoadRunner / Laravel Octane | 高併發、長連線、WebSocket、任務佇列 | 高 |
| JIT 編譯 | PHP 8.1+ opcache.jit=1255 | CPU 密集型(圖像、加密、科學計算) | 中 |
| 靜態化/邊緣快取 | Nginx fastcgi_cache / Varnish / Cloudflare | 內容型站點、讀多寫少 | 中 |
| 資料庫分庫分表 | ShardingSphere / Vitess / 中間件 | 單表超億、寫入瓶頸 | 極高 |
| 微服務拆分 | API Gateway / Service Mesh / gRPC | 團隊擴展、業務解耦、獨立部署 | 極高 |
| 監控分析 | Blackfire / Tideways / Xdebug Profiler / Prometheus+Grafana | 持續觀測、火焰圖定位瓶頸 | 中 |
++$i vs $i++,而慢查詢無索引、無快取。gc_collect_cycles() 影響。效能優化無終點,只有持續的「測量→優化→驗證」循環。把精力花在高 ROI 的架構層面,微優化交給 OPcache 和靜態分析工具自動處理。