PHP 效能優化非單一技巧,而是系統性工程。本文整理 56 條實戰守則,涵蓋語法、函式選擇、記憶體、資料庫、快取、Web 伺服器等層面,附帶實測數據與原理解析。
靜態方法調用無需實例化,省去物件建構開銷。十萬次以上調用可見 3 倍以上差距。但靜態方法常駐記憶體,濫用會增加記憶體壓力。
echo 無回傳值,print 回傳整數。實測 echo 快約 8%。大字串輸出時啟用 ob_start 或 Apache mod_deflate 壓縮。
// 差
for ($i = 0; $i < count($arr); $i++) { ... }
// 好
$len = count($arr);
for ($i = 0; $i < $len; $i++) { ... }
PHP 陣列/物件記憶體利用率極低(C 需 100MB,PHP 可能佔 1GB)。用完立即 unset($bigArray),長期運行腳本(如 Worker)尤為關鍵。
__autoload 若無法高效對應類名到實體檔案,會觸發大量 file_exists 磁碟 I/O。建議制定清晰對應規則(PSR-4)並使用 Composer 自動載入(類別映射快取)。
require_once 需檢查是否已載入,改用 require/include 配合自動載入器。
避免 include_path 遍歷查找,減少系統呼叫開銷。
$_SERVER['REQUEST_TIME']直接取得已計算好的值,比 time() 快。
strtr 單字元替換用字串而非陣列:strtr($str, 'abcd', 'efgh') 比陣列版快 10 倍。
strtr > str_replace > preg_replacestrpos 判斷是否需替換:無需替換時快 200%函式同時支援字串與陣列參數時,拆分為多次字串呼叫往往更快。
@ 內部操作複雜,循環中使用慢 3 倍。改用 error_reporting(0) 區塊控制。
$row['id'] 比 $row[id] 快 7 倍(後者先嘗試常數查找)。
for ($i=0; $icount()。
局部變數 (最快) ≈ 類方法內局部變數 < 全域變數 (慢 2x) < 物件屬性 $this->prop (慢 3x) < 未宣告局部變數 (慢 9-10x)
PHP 可能檢查存在性。
類別內方法多寡不影響單一方法呼叫速度。
繼承鏈越短查找越快。
函式 ≈ 7-8 次 $i++,方法 ≈ 15 次。
雙引號需解析變數,單引號不解析。大字串連接用單引號 + .。
echo $a, $b; 避免字串連接產生暫時字串。
能靜態化就靜態化,或用快取生成靜態檔。
分散式記憶體快取,減輕 DB 壓力。OPcache 快取編譯後 opcode,免重複編譯。
ip2long()/long2ip() 存 INT UNSIGNED,省 1/4 空間,利於排序與範圍查詢。
checkdnsrr() 確認域名有對應 IP。
mysql_* 已棄用移除,mysqli 支援預處理、事務、多查詢。
$x = $cond ? $a : $b; 簡潔且略快於 if/else。
勿重複造輪子,成熟套件經過優化測試。
error_reporting(0) 或 php.ini: display_errors=Off,防洩漏 SQL/路徑。
gzcompress()/gzuncompress()(gzip 演算法)壓縮率 90%+。
function foo(&$var) { ... } 避免大陣列複製。
永遠使用預處理語句(Prepared Statements)。
// 差
if (strlen($foo) < 5) { ... }
// 好
if (!isset($foo[5])) { ... } // 語言結構,無函式呼叫開銷
需 3 opcode,後置 $i++ 需 4 opcode(建立暫時變數)。
// 差 $desc = $_POST['description']; echo $desc; // 好 echo $_POST['description'];
惡意輸入 512KB 導致 1MB 記憶體佔用。
可讀性佳,內部跳躍表優化。
整體讀取更高效,注意 PHP 版本對 URL 開啟支援。
能用快取/記憶體就不用檔案。
批次寫入、覆蓋索引、避免 SELECT *。
C 實作遠快於 PHP 使用者空間實作。
移至循環外複用。
考慮 array_walk_recursive 或重新設計資料結構。
內部優化,語法簡潔。
符合 C/C++ 慣例,略快。
釋放符號表項目。
每個方法/物件調用有開銷,關鍵路徑可用程序式寫法。
過度拆分增加調用開銷,聚焦真正複用的邏輯。
核心運算下沉到 C 層(如 PHP-FFI、Zephir、原生擴充)。
傳輸層壓縮,配合 echo 大輸出效果顯著。
釋放資源,防連線池耗盡。
實測 split(支援正則分隔)平均快 23%,但 split 已棄用(PHP 7 移除),實務請用 preg_split 或 explode。
優化是權衡藝術:正確性 > 可讀性 > 效能。優先解決演算法複雜度、資料庫索引、快取策略等大項,再微調語法細節。建立效能基準(Profiling:Xdebug、Blackfire、Tideways),針對熱點優化,避免過早優化。