OPcache 生产环境需确保真实启用、参数调优及与 Symfony 缓存协同:验证 FPM/CLI 双环境启用,设 opcache.enable=1、validate_timestamps=0、memory_consumption≥256MB;部署后执行 cache:warmup 并关闭 debug;可选预加载核心类提升性能。

OPcache 配置不是加几行 ini 就完事,关键在“配对生效”——既要让 PHP 真加载它,又要让 Symfony 的各类缓存(路由、翻译、验证器、模板)真正复用它。生产环境里 80% 的慢请求,根源是 OPcache 没跑起来,或跑起来了但被 Symfony 的 debug 模式、权限问题、CLI/FPM 配置不一致悄悄绕过了。
确认 OPcache 已真实启用
别只看 php.ini 里写了 opcache.enable=1。很多项目 CLI 能用,Web 请求却没生效,因为 FPM 和 CLI 加载的是两套配置。
- 查 CLI:运行
php -m | grep opcache或php -i | grep "OPcache" - 查 Web(FPM):创建
info.php放入 Web 根目录,访问并搜索 “OPcache”,确认状态为 “enabled” - 检查是否加载了扩展:确认
extension=opcache.so(Linux/macOS)或extension=php_opcache.dll(Windows)未被注释,路径正确 - 开发时别被迷惑:
bin/console命令走 CLI,且 debug 模式下热加载会跳过 OPcache,不能代表线上表现
生产环境核心参数设置
默认配置面向开发,生产必须调优。重点就三个:
-
opcache.enable=1—— 必开 -
opcache.validate_timestamps=0—— 生产必须关掉自动校验,否则每次请求都 stat 文件,缓存形同虚设 -
opcache.memory_consumption=256(单位 MB)—— Symfony 应用类多,建议至少 192,中大型项目直接设 256 或 512;如果报 “Cached scripts overflow”,再同步调大opcache.max_accelerated_files(建议 40000+)
其他推荐项:opcache.revalidate_freq=0(配合 validate_timestamps=0)、opcache.fast_shutdown=1、opcache.enable_cli=1(方便 console 命令也受益)。
让 Symfony 缓存与 OPcache 协同工作
OPcache 缓的是 PHP 字节码,Symfony 缓的是编译后对象(如路由、翻译目录、验证规则)。两者要“配对”,才能跳过重复解析。
- 确保
var/cache/prod目录可写,且 Web 进程用户(如www-data)和 CLI 用户有相同权限(推荐setfacl方案,不用 chmod 777) - 部署后必须执行:
php bin/console cache:warmup --env=prod—— 它把路由、Twig 模板、验证器等提前编译成 PHP 文件,这些文件随后会被 OPcache 自动缓存 - 禁用 debug:
APP_DEBUG=0且kernel.debug=false,否则缓存键含调试信息,无法跨请求复用 - 翻译组件特别注意:
Translator生成的catalogue.xx.php缓存文件,正是 OPcache 最擅长加速的对象;预加载(opcache.preload)还能进一步把Translator.php等核心类常驻内存
进阶:用预加载(Preload)榨干性能
OPcache 预加载是在 PHP 启动时就把指定类/文件加载进共享内存,所有请求直接复用,彻底消除首次加载开销。Symfony/Translation、EventDispatcher 等组件已内置预加载提示(源码顶部有 // Help opcache.preload discover always-needed symbols)。
- 新建
config/preload.php,列出核心类:<?php<br>opcache_compile_file(__DIR__.'/../vendor/symfony/translation/Translator.php');<br>opcache_compile_file(__DIR__.'/../vendor/symfony/event-dispatcher/EventDispatcher.php');<br>// 可补充 MessageCatalogue、OptionsResolver 等
- 在 php.ini 中添加:
opcache.preload=/path/to/your/project/config/preload.php<br>opcache.preload_user=www-data
- 重启 PHP-FPM,用
opcache_get_status()['preload_statistics']验证是否加载成功


















