優化目標:「以最小代價換取最快執行速度與最易維護代碼」。本文精選 8 個高影響力優化技巧,附程式碼對照與原理解析。
問題:in_array() 針對大陣列(>20 元素)在迴圈中極度低效,O(n) 線性搜尋。
// ❌ 慢:大陣列迴圈查找
foreach ($bigArray as $item) {
if (in_array($item, $hugeArray)) { ... }
}
// ✅ 快:鍵值查找 O(1)
$lookup = array_flip($hugeArray); // 或直接建立鍵為值的陣列
foreach ($bigArray as $item) {
if (isset($lookup[$item])) { ... }
}
// ✅ 更快:直接用鍵名存取
if (isset($array[$key])) { ... }
// ❌ 錯誤:常數查找落回字串,觸發 E_NOTICE $foo = $arr[key]; // ✅ 正確:字串鍵名 $foo = $arr['key']; // ✅ 變數鍵名無需引號 $foo = $arr[$var];
// ✅ 快:無變數解析
$str = '長字串無變數';
doStuff($str);
// ⚠️ 適度破例:可讀性優先時用雙引號
$url = "{$root}posting.php?mode=$mode&start=$start";
// ❌ 每次迴圈呼叫 sizeof()
for ($i = 0; $i < sizeof($data); $i++) { ... }
// ✅ 預先計算
for ($i = 0, $n = sizeof($data); $i < $n; $i++) { ... }
// ✅ 更好:foreach 避免索引管理
foreach ($data as $item) { ... }
// ✅ 跳躍表優化,可讀性佳
switch ($action) {
case 'add': handleAdd(); break;
case 'edit': handleEdit(); break;
case 'delete': handleDelete(); break;
default: handleError();
}
@ 會複製整個錯誤處理上下文,效能損耗極大(數倍)。
// ❌ 災難:迴圈中使用 @ for ($i=0; $i<10000; $i++) @file_get_contents($files[$i]); // ✅ 正確:檢查後處理 if (file_exists($file)) $content = file_get_contents($file);
// ❌ 函式呼叫開銷 $time = time(); // ✅ 直接存取超全域變數 $time = $_SERVER['REQUEST_TIME']; // ✅ 微秒精度(PHP 7.0+) $time = $_SERVER['REQUEST_TIME_FLOAT'];
// ❌ 函式呼叫
if (strlen($str) < 5) { ... }
// ✅ 語言結構,直接存取 zval 長度
if (!isset($str[5])) { ... } // 長度 <= 4 時為 true
// 注意:多位元組字串需用 mb_strlen()
| 場景 | 優化方向 | 預期效果 |
|---|---|---|
| 大量陣列查找 | 鍵值索引 + isset() | 10-100x 加速 |
| 頻繁字串拼接 | 單引號、sprintf、陣列 join | 減少記憶體分配 |
| 資料庫查詢 | 索引、EXPLAIN、N+1 消除 | 數量級提升 |
| 重複計算 | 快取、靜態變數、OPcache | 消除冗餘運算 |
掌握這 8 大技巧並建立效能意識,配合持續監控與分析,才能打造高效能 PHP 應用。