請求到達
↓
1. 讀取 .php 文件
2. 詞法分析 → 語法分析 → 生成 AST
3. 編譯為 Opcode (Zend VM 指令)
4. 執行 Opcode
↓
響應返回
關鍵洞察: 步驟 1-3 (編譯階段) 每次請求**重複執行**,與代碼複雜度正相關。大型項目 (數萬文件) 編譯耗時可達請求總時間 30-50%。
將編譯後的 Opcode 存入**共享內存 (SHM)**,後續請求直接從 SHM 讀取跳過編譯階段。
無緩存: 請求 → 讀文件 → 詞法/語法分析 → 編譯 → 執行
有 Opcode 緩存:請求 → 檢查 SHM (命中) → 直接執行
請求 → 檢查 SHM (未命中/文件變更) → 編譯 → 存入 SHM → 執行
| 方案 | 類型 | PHP 版本 | 狀態 | 特點 |
|---|---|---|---|---|
| OPcache | 核心擴展 | PHP 5.5+ 內置 | 標準配置 | 官方維護、JIT 支持 (PHP 8+)、生產級穩定 |
| APCu | 用戶緩存擴展 | PHP 5.5+ (PECL) | 配套使用 | 僅緩存用戶變量 (非 Opcode),替代舊 APC |
| APC (舊) | Opcode + 用戶緩存 | PHP 5.4- | 已停止維護 | 不再推薦 |
| XCache | 第三方 | PHP 5.x | 已停止維護 | 早期優秀方案 |
| WinCache | 微軟 IIS 專用 | PHP 5.4+ | Windows 專用 | IIS 整合佳 |
; 必開
opcache.enable=1
opcache.enable_cli=1 ; CLI 腳本/隊列 Worker 也受益
; 內存分配 (根據項目代碼大小調整,典型 128-512MB)
opcache.memory_consumption=256
; 緩存文件數上限 (項目 PHP 文件數 * 1.2-1.5)
opcache.max_accelerated_files=20000
; 浪費內存重啟閾值 (防止碎片化)
opcache.max_wasted_percentage=10
; 文件更新檢查策略
; 生產:0 (不檢查,需重啟 PHP-FPM 或 cachetool 刷新) — 性能最佳
; 開發:2 (每請求檢查文件時間戳) — 即時生效
opcache.validate_timestamps=0
opcache.revalidate_freq=0
; 快速關閉 (請求結束不逐個銷毀 zval,交給內存管理器)
opcache.fast_shutdown=1
; PHP 8+ JIT (實驗/生產視負載)
opcache.jit_buffer_size=128M
opcache.jit=1255 ; tracing + function 內聯
; 除錯用
; opcache.opt_debug_level=0
; opcache.record_warnings=1
# 方案 1:PHP-FPM 平滑重啟 (推薦)
systemctl reload php8.2-fpm # 或 kill -USR2 $master_pid
# 方案 2:cachetool (CLI 管理 OPcache)
# composer require gordalina/cachetool
php cachetool.phar opcache:reset --fcgi=/run/php/php8.2-fpm.sock
# 方案 3:文件原子替換 + validate_timestamps=0
# 部署腳本:
# 1. 新代碼部署到 /var/www/releases/20240101/
# 2. ln -sfn /var/www/releases/20240101 /var/www/current
# 3. reload php-fpm (或 cachetool reset)
# 關鍵:文件 inode 變更,OPcache 視為新文件重新編譯
<?php
// 只緩存 PHP 變量 (陣列、對象、字符串),不緩存 Opcode
apcu_store('config:app', $hugeConfigArray, 3600); // TTL 秒
$config = apcu_fetch('config:app');
# 遞增計數器 (原子操作)
apcu_inc('counter:page_view'); // 返回新值
# 信息
apcu_cache_info(); // 命中率、內存使用、條目數
?>
APCu 適合**單機多進程共享只讀/低頻寫數據** (配置、字典、計數器)。分布式場景請用 Redis。
<?php
$info = opcache_get_status();
echo "Hit Rate: " . ($info['opcache_statistics']['hits'] /
($info['opcache_statistics']['hits'] + $info['opcache_statistics']['misses']) * 100) . "%\n";
echo "Memory Used: " . ($info['memory_usage']['used_memory'] / 1024 / 1024) . " MB\n";
echo "Cached Scripts: " . $info['opcache_statistics']['num_cached_scripts'] . "\n";
validate_timestamps=0 部署忘記重啟/重置 → 運行舊代碼。memory_consumption 過小 → 頻繁重啟/驅逐 → 性能抖動。opcache.enable_cli=1 → CLI 命令 (佇列、遷移) 無緩存。Opcode 緩存是 PHP 性能**投入產出比最高**的優化:**零代碼修改、配置即生效、提升 20-50% 吞吐**。生產環境**強制開啟 OPcache + validate_timestamps=0 + 原子部署 + 平滑重啟**。APCu 作為用戶級 SHM 緩存補充單機熱數據。**監控命中率與內存使用率**納入日常巡檢。