PHP 獨特的語法融合了 C、Java、Perl 及自創語法,能比 CGI 或 Perl 更快執行動態網頁。PHP 將程式碼嵌入 HTML 文件中執行,效率遠高於完全生成 HTML 標籤的 CGI。以下整理 42 條實戰優化準則,助你寫出高效能的 PHP 程式碼。
核心語法與語言結構優化
- 靜態方法優先:若方法可靜態化,請宣告為
static,速度可提升 4 倍。
- echo 勝過 print:
echo 比 print 快,且支援多參數(用逗號分隔)避免字串連接開銷。
- 單引號優於雙引號:單引號字串不解析變數,解析速度更快;只有在需要變數插值時才用雙引號。
- 避免 @ 抑制錯誤:用
@ 隱藏錯誤訊息極度低效,應妥善處理錯誤而非掩蓋。
- 前置遞增優於後置:
++$i 只需 3 條 opcode,$i++ 需 4 條並產生臨時變數。
- switch-case 取代多重 if-else:選擇分支語句效能更佳。
- foreach 取代 while/for 遍歷陣列:
foreach 效率更高,且無需呼叫 reset()。
- i+=1 取代 i=i+1:符合 C/C++ 慣例,效率略高。
變數與記憶體管理
- 及時銷毀大型變數:特別是大陣列,用
unset() 釋放記憶體。
- 避免使用 __get、__set、__autoload:魔術方法有額外開銷。
- 區域變數最快:在方法中遞增區域變數速度最快,幾乎等同函式呼叫區域變數。
- 全域變數慢 2 倍:遞增全域變數比區域變數慢 2 倍。
- 物件屬性慢 3 倍:
$this->prop++ 比區域變數慢 3 倍。
- 未定義區域變數慢 9-10 倍:遞增未預先定義的區域變數極慢。
- 僅定義未使用的區域變數也拖慢速度:PHP 會檢查是否存在同名全域變數。
- 用完即 unset 全域變數:釋放資源。
函式與字串操作
- 內建函式優於正則:能用函式解決就別用正則表達式。
- str_replace > preg_replace,但 strtr 最快:
strtr 效率是 str_replace 的 4 倍。
- 字串替換參數為陣列時,考慮拆分為單字元替換:參數不長時,逐字元替換可能更快。
- isset() 技巧替代 strlen():檢查字串長度時,
!isset($foo{5}) 比 strlen($foo) < 5 快,因為 isset 是語言結構,無函式呼叫開銷。
- 陣列索引加引號:
$row['id'] 效率是 $row[id] 的 7 倍。
檔案包含與路徑
- require_once 代價高:能用
require 或 include 就避免 require_once。
- 包含檔案使用絕對路徑:減少解析
include_path 的時間。
資料庫與連線
- 用完即關閉資料庫連線:避免長連線佔用資源。
- 優化 SQL 查詢:減少
INSERT、UPDATE 操作,善用索引。
快取與編譯優化
- 啟用 OPcode 快取:如 APC、xcache、Zend Optimizer,免除重複編譯,效能提升 25%-100%。
- 善用 memcached:高效能記憶體物件快取系統,加速動態應用、減輕資料庫負載。
- 輸出緩衝控制:利用
ob_start() 等函式實現靜態模板技術,減少資料庫查詢。
- Apache 啟用 mod_deflate / mod_zip:即時壓縮傳輸資料,流量降低 80%。
- 靜態 HTML 為主:Apache 解析 PHP 比靜態 HTML 慢 2-10 倍,盡量靜態化。
- 取得腳本啟動時間用 $_SERVER['REQUEST_TIME']:比
time() 精確且快。
架構與設計原則
- 不盲目面向物件:OOP 開銷大,每個方法與物件呼叫消耗記憶體;陣列同樣好用。
- 避免過度封裝:別把方法拆得太碎,思考真正可重用的程式碼。
- 大量使用內建函式:PHP 核心函式經 C 語言優化,極快。
- 耗時函式考慮 C 擴展:核心瓶頸可用 C 撰寫擴展。
- 定期 Profiling:用 Xdebug 等工具找出效能瓶頸。
掌握這 42 條準則,並結合實際專案情境靈活套用,能讓你的 PHP 應用效能大幅提升。記住:優化是持續的過程,而非一次性任務。