PHP 效能優化非單一技巧可解,需從「語法微調」、「資料庫設計」、「快取策略」、「伺服器配置」多維度著手。本文整理 50+ 經驗法則,附上原理說明與驗證方式,供開發者依專案情境取用。
雙引號會解析變數,單引號不解析。echo 'hello '.$name 比 echo "hello $name" 快。
非實例方法宣告為 static,呼叫速度提升約 4 倍(免建立物件)。
$row['id'] 比 $row[id] 快 7 倍。無引號會被視為常數查找,觸發 E_NOTICE 並轉字串。
echo $a, $b, $c;(逗號)比 echo $a . $b . $c;(點號)快,因為免建立中間字串。
// 差:每次迴圈都 count()
for ($i=0; $i<count($arr); $i++) { ... }
// 好:預先計算
$count = count($arr);
for ($i=0; $i<$count; $i++) { ... }
// 更好:foreach 內部優化最佳
foreach ($arr as $v) { ... }
大陣列、物件處理完畢立即 unset($bigArray),配合 gc_collect_cycles() 強制回收。
__get/__set/__autoload魔術方法呼叫開銷大,熱點路徑改用明確 getter/setter 或 spl_autoload_register。
Composer PSR-4 自動載入僅在需要時載入檔案,免手動管理 require。
避免 PHP 在 include_path 逐層查找,__DIR__ . '/config.php' 最快。
$_SERVER['REQUEST_TIME']免呼叫 time(),直接取得整數時間戳(秒)。
strtr 內部優化最佳,單字元替換效能是 str_replace 4 倍。
編譯為跳躍表,條件多時顯著更快;且可讀性更好。
@ 抑制錯誤@ 會產生額外錯誤處理開銷,極度低效。改用 isset()、empty()、try-catch。
壓縮 HTML/JS/CSS 傳輸量,降低 70-80% 頻寬,提升首屏速度。
長連線易導致連線數耗盡、閒置連線佔用資源。短連線 + 連線池(如 PgBouncer、ProxySQL)更穩定。
移至迴圈外部複用,或使用生成器 yield 惰性產生。
改用 array_column、array_map、array_walk_recursive 向量化操作。
strpos、substr、explode 等 C 層實作遠快於 PCRE。
內建函式經 C 編譯、OPcache 快取,呼叫開銷極低。
影像處理、加密、壓縮等 CPU 密集任務,移至 C 層可提升 10-100 倍。
找出真正瓶頸(通常是 SQL、外部 API、少數熱點函式),別靠直覺優化。
編譯後的 opcode 快取於共享記憶體,免重複編譯,效能提升 25-100%。
資料庫查詢結果、運算結果、頁面片段快取,降低 DB 壓力、縮短回應時間。
strlen() vs isset() 檢查字串長度// 慢:函式呼叫開銷
if (strlen($str) < 5) { ... }
// 快:語言結構,無函式呼叫
if (!isset($str[5])) { ... }
++$i 比 $i++ 快前置遞增 3 條 opcode,後置 4 條(需建立暫存變數)。
每個方法呼叫、物件建立都有記憶體與 CPU 開銷。純資料容器用陣列或 stdClass 即可。
便於測試、維護、OPcache 優化;大函式拆分為多個小函式。
複雜邏輯用 if-else,三元運算子嵌套極難閱讀且易出錯。
error_reporting(E_ALL) 會對未初始化變數發出 Notice,影響效能。用 isset()/empty()/?? 防禦。
除非需要變數插值或跳脫字元,否則單引號解析最快。
$i += 1 優於 $i = $i + 1符合 C 慣例,opcode 更少。
unset()減少符號表查找開銷,釋放記憶體。
優化是持續過程:測量 → 找出瓶頸 → 針對性調整 → 再測量。語法微調效果有限(通常 <5%),資料庫索引、快取策略、架構設計才是大贏家。建議團隊建立「效能預算」,每次部署前跑基準測試,守住底線。