語法與基礎優化
- 靜態方法優先:可聲明
static 的方法盡量聲明,調用速度提升 ~4 倍
echo 勝過 print:echo 無返回值,語言結構而非函數,更快
echo 多參數輸出:echo 'a', 'b', 'c'; 避免字串連接開銷
- 單引號字串:不解析變量,比雙引號快;無變量插值時優先用單引號
- 循環前計算長度:
$len = count($arr); for ($i=0; $i<$len; $i++) 避免每次調用 count()
foreach 優於 for/while:內部優化,語法更簡潔,效能更好
- 避免循環內聲明大變量/物件:移至循環外復用,減少記憶體分配/GC 壓力
- 多維陣列避免深層嵌套循環賦值:考慮重構資料結構或使用引用
- 字串操作用內建函數替代正則:
strpos/str_replace/substr 遠快於 preg_*
strtr > str_replace > preg_replace:單字符替換 strtr 效能最高(約 4x str_replace)
變數與記憶體管理
- 及時
unset() 大變量:特別是大陣列、物件,釋放記憶體
- 避免
__get/__set/__autoload 魔術方法:觸發開銷大,熱路徑禁用
require_once 代價高:生產環境用 Composer 自動載入(ClassMap/PSR-4),避免運行時檢查
- 包含文件用絕對路徑:減少路徑解析開銷
- 用
$_SERVER['REQUEST_TIME'] 替代 time():無系統調用,直接取請求開始時間
- 字串比較優先
strncasecmp/stripos/strpbrk:避免正則
switch 優於多層 if-else:跳躍表優化,可讀性更好
- 避免
@ 抑制錯誤:極大效能損耗,改用條件判斷或錯誤處理器
- 全域變量用完即
unset:減少符號表查找開銷
- 循環嵌套:長循環外層,短循環內層:減少 CPU 跨層切換
進階效能技巧
- 區部變量遞增最快:方法內
$i++ ≈ 區部變量存取速度
- 全域變量遞增慢 2x:符號表查找開銷
- 物件屬性遞增慢 3x:
$this->prop++ 涉及物件屬性查找
- 未預定義區部變量遞增慢 9-10x:首次創建符號表條目
- 僅定義未使用的區部變量也有開銷:PHP 仍會檢查全域同名變量
- 方法調用開銷與類方法數無關:不用擔心類膨脹影響調用速度
- 子類方法執行快於父類同名方法:繼承鏈查找更短
- 空函數調用 ≈ 7-8 次區部變量遞增:函數調用有固定開銷
- 方法調用 ≈ 15 次區部變量遞增:物件方法調用額外開銷
- Apache 解析 PHP 比靜態 HTML 慢 2-10 倍:盡量靜態化、CDN 緩存
緩存與架構級優化
- 啟用 OPcache:PHP 5.5+ 內建,編譯緩存提升 25-100% 效能
- 數據緩存用 Redis/Memcached:熱點數據、會話、查詢結果緩存
- 資料庫查詢優化:索引、避免
SELECT *、分頁優化、讀寫分離
- 減少 SQL 查詢次數:N+1 問題用
JOIN/IN/批量查詢解決
- HTTP 層面緩存:
ETag/Last-Modified/Cache-Control、CDN、Varnish/Nginx fastcgi_cache
- 啟用 Gzip/壓縮:
mod_deflate/gzip 傳輸體積降低 70-80%
- 異步處理耗時任務:隊列(Redis/RabbitMQ)+ Worker,HTTP 請求秒級返回
- 連接池復用:資料庫、Redis、HTTP 客戶端連接池,避免頻繁握手
- Profile 定位瓶頸:Xdebug + Webgrind、Blackfire、Tideways,數據驅動優化
- PHP 版本升級:PHP 8.x JIT、類型系統、內建函數優化,較 5.x 提升 2-3 倍
常見誤區與避坑
| 誤區 | 真相 |
| 微優化痴迷(如單雙引號) | 90% 瓶頸在 I/O(DB、HTTP、磁盤),優化 SQL/緩存/架構收益遠大於語法微調 |
| 過早優化 | 先寫正確、可維護代碼,Profile 後針對熱點優化 |
| 禁用錯誤報告提升效能 | 錯誤隱藏不等於不發生,生產環境應記錄日誌而非顯示 |
| 所有類都做單例 | 單例增加耦合、難測試,狀態無關服務用靜態方法或依賴注入 |
| 陣列總是比物件快 | 物件有類型提示、封裝、自動載入優勢,現代 PHP 物件開銷極低 |
快速檢查清單(部署前)
# 1. OPcache 啟用並調優
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0 # 生產環境關閉,部署後需重啟 PHP-FPM
opcache.jit=1255 # PHP 8.0+ 開啟 JIT
# 2. 實際內存限制
memory_limit=256M
# 3. 禁用危險函數
disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
# 4. 會話安全
session.cookie_httponly=1
session.cookie_secure=1
session.use_strict_mode=1
# 5. Composer 優化自動載入
composer dump-autoload --optimize --classmap-authoritative --no-dev