前言
PHP 效能優化是系統工程,涵蓋語法微優化、演算法選擇、資料庫存取、快取策略、擴充套件調校等多層面。本文彙整 50+ 實戰技巧,附程式碼對比與效能數據參考,助你建構高效能 PHP 應用。
一、語法與基礎優化
| 技巧 | 說明 | 效能增益 |
| 單引號字串 | 'str' 不解析變數,比 "str" 快 | ~5-10% |
echo 多參數 | echo $a, $b; 避免字串連接暫存 | 微幅 |
foreach 替代 for/while | 內部優化、語法簡潔 | ~10-20% |
避免迴圈內 count()/strlen() | 預存長度:for($i=0,$n=count($arr);$i<$n;$i++) | ~50-75% |
++$i 優於 $i++ | 前置遞增少建立暫存變數 | 微幅 |
靜態方法標記 static | PHP 5+ 靜態呼叫非靜態方法觸發 E_STRICT,慢 50-60% | 大幅 |
類常數 const | 編譯期解析、雜湊表更小、查找更快 | ~3500% vs 函數 |
避免 require_once/include_once | 每次檢查檔案是否載入,改用自動載入器 | I/O 減少 |
絕對路徑 include | 避免 include_path 遍歷查找 | ~20% |
二、字串處理優化
- 能用字串函數別用正則:
strpos()/str_replace()/substr() 比 PCRE 快數倍
strtr() 單字元替換用字串而非陣列:
$str = strtr($str, 'abcd', 'efgh'); // 快 10 倍
// $str = strtr($str, ['a'=>'e', ...]); // 慢
- 先
strpos() 判斷是否需替換:
if (strpos($haystack, $needle) !== false) {
$result = str_replace($needle, $replacement, $haystack);
}
// 不需替換時快 200%
- 前綴比對用
strncmp()/strncasecmp():比 substr()+比較快
- 避免常量當字串:
echo MY_CONST 比 echo 'MY_CONST' 慢 700% (雜湊查找、大小寫轉換、Notice)
三、陣列操作優化
四、資料庫優化
- Prepared Statement:防注入、重用執行計畫
- 索引覆蓋查詢:
EXPLAIN 分析,避免全表掃描
- 批次插入:
INSERT INTO ... VALUES (...),(...),(...) 比迴圈單筆快數十倍
- 避免 SELECT *:只取需要欄位,減少網路傳輸與記憶體
- 連線池/持久連線:
PDO::ATTR_PERSISTENT => true (慎用,視架構)
- 讀寫分離/主從複寫:架構層面分流
五、快取策略
| 層級 | 工具 | 適用場景 | TTL 建議 |
| Opcode | OPcache (PHP 內建) | 所有生產環境必開 | 永久 (部署時清除) |
| 資料快取 | Redis / Memcached | 熱點資料、Session、佇列 | 秒~小時 |
| HTTP 快取 | ETag / Last-Modified / Cache-Control | 靜態資源、API 回應 | 依業務 |
| 頁面片段 | Smarty block cache / Laravel view cache | 局部動態頁面 | 分鐘~小時 |
| 查詢結果 | MySQL Query Cache (已棄用) / 自建 Redis | 複雜報表查詢 | 分鐘 |
六、記憶體管理
- 及時
unset() 大變數:釋放記憶體給 GC
- 生成器
yield 處理大資料集:逐行處理 CSV/資料庫游標,避免一次載入全部
- 避免
@ 抑制錯誤:@ 內部建立錯誤處理上下文,慢 3 倍,迴圈中更嚴重
- 關閉
xdebug 生產環境:極大效能損耗
七、擴充套件與工具
- OPcache:
opcache.enable=1, opcache.memory_consumption=256, opcache.validate_timestamps=0 (生產)
- APCu:本機使用者快取,單機高效
- JIT (PHP 8+):
opcache.jit_buffer_size=100M, opcache.jit=tracing,計算密集型顯著提升
- Profiling:Xdebug Profiler + KCacheGrind、Blackfire.io、Tideways
八、架構層面優化
- 非同步處理:佇列 (RabbitMQ/Redis/RocketMQ) 處理耗時任務 (郵件、報表、推播)
- CDN 靜態資源:卸載頻寬、降低延遲
- 資料庫讀寫分離:主寫從讀
- 微服務拆分:核心鏈路輕量化
- 負載均衡 + 無狀態:水平擴展
總結:優化優先級矩陣
| 優先級 | 動作 | 投入產出比 |
| P0 (必做) | 啟用 OPcache、資料庫索引、Prepared Statement、關閉 xdebug | 極高 |
| P1 (高) | Redis 快取熱點資料、批次 SQL、Nginx 靜態檔案快取、CDN | 高 |
| P2 (中) | OPcache 調校、JIT 啟用、自動載入器優化、生成器處理大資料 | 中 |
| P3 (微調) | 單引號、++$i、strtr 字串、避免 @、foreach 細節 | 低 (但累積可觀) |
效能優化是持續迭代過程:**測量 → 找瓶頸 → 優化 → 驗證**。切勿過早微優化,優先解決架構、資料庫、快取層面的大塊增益。
- 上一篇文章: PHP 變數完整指南:常數、變數、可變變數、靜態、全域、超全域、參考賦值
- 下一篇文章: PHP 數據結構優化實戰:從巢狀循環到父子表分離的高效重構
Copyright ©
程式碼之家 All Rights Reserved