PHP 效能優化不是玄學,而是可量化、可驗證的工程實踐。本文整理 20 條核心優化原則,涵蓋語法層面、函數選擇、記憶體管理、資料庫互動、伺服器配置等維度,附帶原理說明與基準測試參考。
// ✅ 推薦:單引號不解析變數,解析速度較快 echo 'Hello ' . $name . ', welcome!'; // ❌ 避免:雙引號需掃描變數插值 echo "Hello $name, welcome!"; // ✅ echo 多參數優於字串連接 echo 'Hello ', $name, ', welcome!'; // 無連接開銷
原理:雙引號字串需編譯器掃描變數插值;單引號視為字面量。echo 是語言結構而非函數,支援多參數直接輸出,避免字串連接產生臨時變數。
class Utils {
// ✅ 靜態方法:無需實例化,調用快 ~4 倍
public static function formatDate($timestamp) {
return date('Y-m-d', $timestamp);
}
}
// 調用
Utils::formatDate(time());
原理:靜態方法不需建立物件實例,省去 new 開銷與 $this 指標解析。
// ✅ 正確:字串索引 $row['id']; // ❌ 錯誤:裸常數索引,PHP 會先嘗試尋找常數 id,找不到再當字串處理,慢 7 倍 $row[id];
echo 優於 printecho 無回傳值,print 回傳 1,語法解析與執行略快。
foreach// ❌ 每次迴圈重新計算 count()
for ($i = 0; $i < count($arr); $i++) { }
// ✅ 預計算
$count = count($arr);
for ($i = 0; $i < $count; $i++) { }
// ✅ 最佳:foreach 內部優化,語義更清晰
foreach ($arr as $item) { }
$largeData = fetchHugeDataset(); // 處理完畢後 unset($largeData); // 釋放記憶體,特別在長腳本/CLI 關鍵
__get/__set/__autoload魔術方法透過攔截器實現,每次呼叫額外開銷大。現代 PHP 使用 Composer PSR-4 自動載入替代 __autoload;屬性存取改用公開屬性或明確 Getter/Setter。
require_once 成本高,優先 require + 邏輯控制require_once 內部維護已載入檔案表,檢查開銷大。單一入口架構下通常不需重複載入,直接用 require。
// ✅ 避免遍歷 include_path require __DIR__ . '/../config/database.php'; // ❌ 相對路徑需搜尋 include_path require 'config/database.php';
$_SERVER['REQUEST_TIME']內建變數直接可用,避免呼叫 time() 或 microtime() 函數開銷。
// ✅ 簡單替換用 str_replace
str_replace(['{name}', '{age}'], [$name, $age], $template);
// ❌ 避免濫用 preg_replace
preg_replace('/\{name\}/', $name, $template);
strtr > str_replace > preg_replace單字元轉換 strtr 效能最佳(C 層級優化);陣列替換用 str_replace;複雜模式才用正則。
// 當替換對照表較小時,逐字元處理可能更快
$map = ['&' => '&', '<' => '<', '>' => '>'];
foreach ($map as $k => $v) {
$str = str_replace($k, $v, $str);
}
switch 優於多重 if-elseifswitch 內部優化為跳躍表,條件多時顯著快於逐條判斷。
@ 抑制錯誤// ❌ 極慢:@ 會修改錯誤報告層級、產生例外處理開銷
$file = @file_get_contents($path);
// ✅ 正確:預先檢查或捕獲例外
if (is_readable($path)) {
$file = file_get_contents($path);
}
mod_deflate / Nginx gzip# Nginx gzip 配置 gzip on; gzip_types text/plain application/json application/javascript text/css text/xml; gzip_min_length 1000;
壓縮傳輸體積 70%+,顯著提升頁面載入速度。
PHP 請求結束會自動關閉,但 CLI 長程序、連線池場景需顯式管理。持久連線 (PDO::ATTR_PERSISTENT) 易導致連線洩漏、閒置超時,慎用。
function test() {
$local = 0;
for ($i = 0; $i < 1000000; $i++) {
$local++; // 最快
}
}
全域變數需查找符號表;物件屬性需解析 $this;區域變數直接在 VM 棧操作。
opcache.jit_buffer_size=100M 針對 CPU 密集型任務顯著加速opcache.preload 啟動時載入常用類別這 20 條鐵律涵蓋 PHP 執行引擎核心特性。**但記住:過早優化是萬惡之源。** 實務流程應為:
大多數專案的瓶頸在資料庫查詢、網路 I/O、缺乏快取,而非語法細節。語法優化是「錦上添花」,架構優化才是「雪中送炭」。