PHP 性能優化可分三層,由易到難、收益遞減:
本文聚焦前兩層,特別是**零代碼修改**即可生效的引擎層優化。
PHP 腳本執行流程:源碼 → 詞法分析 → 語法分析 → 編譯為 Opcode (中間代碼) → Zend VM 執行。Opcode 緩存** 將編譯後的 Opcode 存入共享內存,省去重複編譯步驟,直接進入執行階段。
| 版本 | 組件 | 狀態 |
|---|---|---|
| PHP 4 / 5.0-5.4 | Zend Optimizer (閉源免費) | 需單獨下載安裝,含加載器、編碼器運行時 |
| PHP 5.5+ | Zend Optimizer+ → 改名 OPcache | **內置核心擴展**,開箱即用,性能更強 |
| PHP 7.0+ | OPcache + 全新 Zend Engine 3 | 性能再提升 2x+,內存佔用降低 |
| PHP 8.0+ | OPcache + JIT (Just-In-Time) | 熱代碼編譯為機器碼,計算密集型再提速 |
; === 必開啟 ===
zend_extension=opcache.so ; Windows 為 php_opcache.dll
opcache.enable=1
opcache.enable_cli=1 ; CLI 模式也緩存 (如藥單腳本、隊列worker)
; === 內存分配 ===
opcache.memory_consumption=256 ; 共享內存大小 (MB),視項目代碼量調整,生產建議 128-512
opcache.interned_strings_buffer=16 ; 駐留字符串緩存 (MB)
opcache.max_accelerated_files=20000; 最大緩存文件數,設大於項目總 PHP 文件數
; === 開發/生產差異 ===
opcache.validate_timestamps=1 ; 生產建議 0 (需部署後重啟 php-fpm 或發送 SIGUSR2 刷新)
opcache.revalidate_freq=60 ; validate_timestamps=1 時,檢查間隔秒數
opcache.save_comments=1 ; 保留註釋 (Doctrine/Annotation 依賴)
; === 進階 ===
opcache.fast_shutdown=1 ; 加速關閉 (PHP 7.2+ 已內建優化)
opcache.huge_code_pages=1 ; 使用大頁面 (需 OS 支持,Linux 需配置 hugetlbfs)
<?php phpinfo(); ?>
查看 Zend OPcache 區塊:`Opcode Caching: Enabled`、`Cache hits` 遞增說明命中。
Opcache 只緩存**代碼編譯結果**。業務數據 (配置、查詢結果、計算緩存) 需用戶層緩存。
| 組件 | 類型 | 特點 | 適用場景 |
|---|---|---|---|
| APCu | 本機共享內存 | 極快、無網絡開銷、單機、重啟丟失 | 單機項目、配置表、模板緩存、Composer 類映射 |
| Redis | 網絡內存鍵值庫 | 持久化、集群、豐富數據結構、發布訂閱 | 分佈式緩存、Session、排行榜、分布式鎖、隊列 |
| Memcached | 網絡內存鍵值庫 | 簡單、多線程、無持久化、LRU 淘汰 | 純緩存、靜態頁片段、大對象存儲 |
<?php
// 寫入
apcu_store('config:site', $configArray, 3600); // TTL 1h
// 讀取
$config = apcu_fetch('config:site');
if ($config === false) {
$config = loadFromDb();
apcu_store('config:site', $config, 3600);
}
// 刪除
apcu_delete('config:site');
?>
# 安裝 wrk (現代 HTTP 壓測工具)
wrk -t4 -c100 -d30s https://your-site.com/api/endpoint
# 關鍵指標
Requests/sec # 吞吐量 (越高越好)
Latency (avg/p99) # 延遲 (越低越好)
Transfer/sec # 帶寬佔用
對比**開啟/關閉 OPcache**、**不同緩存策略**前後的 QPS 差異,量化優化收益。
| 優先級 | 動作 | 預期收益 | 成本 |
|---|---|---|---|
| P0 (必做) | 開啟 OPcache (生產 `validate_timestamps=0`) | **2-10x QPS 提升** | 極低 (改配置重啟) |
| P1 | 引入 Redis/APCu 緩存熱點數據/查詢結果 | 降低 DB 壓力 50-90% | 低 (代碼接入) |
| P2 | Composer 優化自動加載、靜態頁緩存 | 減少 10-30% CPU | 低 |
| P3 | 代碼算法優化、數據庫索引、SQL 改寫 | 視具體瓶頸 | 中高 |
| P4 | JIT (PHP 8.1+)、Swoole/RoadRunner 常駐內存框架 | 計算密集型顯著提升 | 高 (架構變更) |
下篇將深入 **輸出壓縮 (gzip/br)、HTTP/2、靜態資源 CDN、瀏覽器緩存策略、資料庫連接池、異步處理** 等前端與架構層優化。