frankenphp 默认不启用 opcache,必须手动配置 php.ini 并重启进程,否则 symfony 每次请求重复加载编译类文件,导致接口卡在 1200ms;需通过 opcache_get_status() 或 /frankenphp/phpinfo 验证启用状态,并确保 zend_extension=opcache.so、opcache.enable=1 等关键项正确配置且生效。

FrankenPHP 默认不启用 OPcache,必须手动配置 php.ini 并重启进程,否则 Symfony 每次请求都在重复加载和编译全部类文件——这正是接口卡在 1200ms 的根本原因。
确认 FrankenPHP 是否已加载 OPcache 扩展
FrankenPHP 是单二进制嵌入 PHP 运行时,但 zend_extension 仍需显式加载,不能依赖编译时默认开启。常见误区是以为“FrankenPHP 自带 PHP 就等于自带 OPcache”。
- 执行
frankenphp --php-version查看 PHP 版本,再运行php -m | grep opcache(注意:这是系统 PHP CLI,不是 FrankenPHP 内置的)——该命令无效,必须换方式 - 正确做法:在 Symfony 项目中加一个临时路由或脚本,输出
opcache_get_status(),返回false或空数组 = 未生效 - 访问
/frankenphp/phpinfo(若启用了内置 phpinfo 路由)或直接写<?php phpinfo(); ?>到 public 目录下访问,搜索 “OPcache”,确认 “Opcode Caching” 显示 Enabled,且 “Cache hits” 开始增长
修改 FrankenPHP 使用的 php.ini 文件
FrankenPHP 不读取系统默认的 /etc/php/*/cli/php.ini 或 /usr/local/etc/php/php.ini,它只加载自己指定路径的配置文件。你改错位置,重启一百次也没用。
- 启动 FrankenPHP 时用
--php-config参数指定配置文件,例如:frankenphp run --php-config ./php.ini - 在
php.ini中必须包含以下几项(缺一不可):zend_extension=opcache.so(Linux/macOS)或zend_extension=php_opcache.dll(Windows)opcache.enable=1opcache.memory_consumption=256opcache.max_accelerated_files=20000opcache.validate_timestamps=1opcache.revalidate_freq=2(Symfony 开发阶段建议设为 2 秒,兼顾性能与热更新) - 切勿把
opcache.enable=0写在 CLI 配置段里覆盖全局;FrankenPHP 运行在 Web SAPI 模式下,必须确保该配置对apache2handler或embedSAPI 生效
Symfony 场景下 OPcache 的关键陷阱
Symfony 的容器编译、代理类、YAML/PHP 配置解析都重度依赖文件加载。OPcache 若配置不当,轻则缓存失效,重则 Class not found 或服务注入失败。
-
opcache.validate_timestamps=0在生产环境绝对禁止——它会让 Symfony 缓存的容器文件永远不刷新,哪怕你改了config/services.php - Symfony 6.4+ 推荐启用
opcache.preload,但需额外配置:opcache.preload=/var/www/symfony/public/preload.php,且 preload.php 中必须用opcache_compile_file()显式预加载核心类,否则无效 - 使用
composer dump-autoload --optimize-autoloader后,务必清空 OPcache:opcache_reset()或重启 FrankenPHP,否则新生成的优化 autoload 文件不会被缓存 - FrankenPHP 的 worker 模式下,OPcache 是进程级的——每个 worker 独享一份缓存,所以
opcache.memory_consumption要按 worker 数量预留(例如 4 个 worker × 256MB = 至少 1GB 可用内存)
验证优化是否真正起效
别只看首页加载快了,要抓真实请求链路里的 PHP 编译耗时。很多团队配完 OPcache,ab 测出来没变化,其实是没测对点。
- 在 Symfony 控制器里插入:
echo 'compile: '.(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']).'s';,对比开启前后该值(典型值应从 800ms → 降到 150ms 以内) - 用
opcache_get_status()['opcache_statistics']['num_cached_scripts']查看当前缓存了多少 PHP 文件,Symfony 全量加载后应稳定在 15000+(取决于 bundle 数量) - 检查
opcache_get_status()['opcache_statistics']['oom_restarts'],若大于 0,说明opcache.memory_consumption不够,正在频繁清空重载 - FrankenPHP 日志里出现
Failed to load Zend extension 'opcache.so',99% 是zend_extension路径写错,或权限不足(尤其 Docker 容器内)
最常被跳过的一步:FrankenPHP 的配置变更后,必须 kill -SIGUSR2 $(pidof frankenphp) 或直接 pkill frankenphp && frankenphp run ...——它不支持 reload,只有重启才能加载新 php.ini。这点和 PHP-FPM 完全不同,容易误判为“配置无效”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











