語法與基礎優化(1-15)
- 單引號字符串:不解析變量,比雙引號快。
- 靜態方法:能
static 就 static,速度提升 ~4 倍。
- 數組鍵加引號:
$row['id'] 比 $row[id] 快 7 倍(避免常量查找)。
- echo 多參數:
echo $a, $b 比 echo $a . $b 快(無連接開銷)。
- 循環預計算上限:
for ($i=0, $n=count($arr); $i<$n; $i++) 或改 foreach。
- 及時 unset 大變量:釋放內存,尤其大數組/對象。
- 避免魔術方法:
__get/__set/__autoload 有額外開銷。
- 慎用 require_once:路徑解析昂貴,優先
include 絕對路徑。
- 包含文件用絕對路徑:省去
include_path 遍歷。
- 腳本啟動時間用 $_SERVER['REQUEST_TIME']:比
time() 快。
- 函數替代正則:
strpos、str_replace 遠快於 preg_*。
- strtr > str_replace > preg_replace:單字符替換
strtr 效率是 str_replace 4 倍。
- 字符替換參數為字符而非數組:避免內部遍歷數組開銷。
- switch 代替多層 if-else:跳轉表優化。
- 禁用 @ 抑制錯誤:極其低效,改用條件判斷或自定義錯誤處理器。
進階與內存優化(16-30)
- 資料庫連接用完即關:避免長連接佔用資源。
- 錯誤抑制代價大:生產環境關閉顯示,記錄日誌。
- 局部變量遞增最快:全局變量慢 2 倍,對象屬性慢 3 倍,未定義局部變量慢 9-10 倍。
- 僅定義未用的局部變量也拖慢速度(PHP 會檢查全局同名)。
- 方法調用與類方法數量無關(測試證實)。
- 子類方法執行快於父類同名方法(查找鏈更短)。
- 空函數調用 ≈ 7-8 次局部遞增;類方法調用 ≈ 15 次。
- PHP 解析比靜態 HTML 慢 2-10 倍:能靜態化就靜態化。
- 啟用 OPcache:避免重複編譯,性能提升 25%-100%。
- 使用 Memcached/Redis 緩存:緩存對象、查詢結果、運算碼。
- strlen() vs isset() 技巧:
if (!isset($str[5])) 比 if (strlen($str) < 5) 快(語言結構 vs 函數調用)。
- ++$i 比 $i++ 快:前者 3 條指令,後者 4 條(產生臨時變量)。
- 不盲目面向對象:方法/對象調用消耗內存,數組往往更輕量。
- 數據結構不必全用類:數組性能優、語法簡潔。
- 方法粒度適中:過度拆分增加調用開銷。
工程化最佳實踐(31-53)
- 盡用內置函數:C 實現,極致優化。
- 瓶頸函數用 C 擴展重寫。
- Xdebug Profiling 定位熱點。
- mod_deflate/mod_gzip 壓縮輸出:傳輸量降 80%。
- file_get_contents 替代 fopen/fread 系列:效率高,注意 PHP 版本對 URL 支持差異。
- 減少文件操作。
- 優化 SQL:少用
SELECT *,索引覆蓋,批量寫入。
- 循環外聲明變量:避免重複分配(特別是對象)。
- 多維數組避免嵌套循環賦值。
- 字符串操作優先內置函數,非必要不用正則。
- foreach 優於 while/for(專為遍歷優化)。
- 單引號字符串(重申)。
$i += 1 優於 $i = $i + 1:符合 C 習慣,指令更少。
- 用完全局變量 unset()。
總結
優化是系統工程:宏觀架構(緩存、靜態化、SQL)決定上限,微觀語法決定下限。建議先用 Profiler 找熱點,再針對性應用上述規則,避免過早優化。