frankenphp的worker模式必须开启opcache预加载,否则类仍需每次请求自动加载,无法发挥常驻优势;预加载需php≥7.4、opcache.enable=1、opcache.preload指向仅含include_once的绝对路径脚本,且须验证preload_statistics内存占用与类数量。

要开,而且比在 PHP-FPM 下更关键——FrankenPHP 的 worker 模式依赖 OPcache 预加载才能真正常驻类定义,否则每次请求仍会触发自动加载开销。
为什么 worker 模式下不预加载就白搭
FrankenPHP 的 worker 模式会让 PHP 进程长期存活,但“进程常驻”不等于“类已加载”。若没启用 opcache.preload,每个新请求进来时,Symfony 的自动加载器(composer/autoload_real.php)仍要逐个检查文件是否存在、解析路径、include_once——这和传统 FPM 每次请求初始化的开销几乎一样,只是省掉了进程启停成本。
预加载的作用是:在 FrankenPHP 启动时,把所有核心类(AppKernel、Container、常用服务类等)一次性编译进 OPcache 内存,后续请求直接命中字节码,跳过文件 I/O 和解析。实测中,未预加载的 worker 模式首屏耗时仅比 FPM 快 15%;开启后可稳定快 60%+(尤其在千级服务的 Symfony 项目中)。
-
opcache.preload必须指向一个真实存在的 PHP 文件(如var/cache/prod/AppPreloader.php),且该文件只能含include_once/require_once调用,不能有逻辑判断或副作用 - Symfony 7+ 会自动生成这个预加载脚本,但需确保执行了
bin/console cache:warmup --env=prod,否则AppPreloader.php是空的 - FrankenPHP 启动前,必须确认
php -v输出含OPcache且opcache.enable=1,否则预加载根本不会触发
FrankenPHP + Symfony 的 opcache 配置要点
FrankenPHP 自带 PHP 运行时,但它读取的是系统级或自定义的 php.ini,不是 Nginx/FPM 那套独立配置。很多人踩坑在于:以为 FrankenPHP 会自动继承 Docker 或宿主机的 OPcache 设置,其实它只认启动时加载的那个 php.ini。
- 用
frankenphp php-info查看实际生效的Loaded Configuration File路径,然后直接编辑该文件 - 必须显式设置:
opcache.enable=1、opcache.enable_cli=1(worker 模式本质是 CLI 环境)、opcache.preload=/absolute/path/to/AppPreloader.php - 别漏掉
opcache.load_comments=1:Symfony 7 的容器编译依赖 PHPDoc 注释,关闭会导致Container类无法正确生成(Docker 环境下尤其常见) -
opcache.use_cwd=0建议设为0,避免预加载时因工作目录不同导致路径解析失败
验证预加载是否真生效
光看配置文件不等于跑通。最直接的方式是启动 FrankenPHP 后,访问 /status(FrankenPHP 默认暴露的监控端点),或在代码里加一行调试:
var_dump(opcache_get_status()['preload_statistics']);
如果输出中 memory_consumption > 0 且 functions、classes 数量合理(例如 Symfony 项目应有数百个类),说明预加载成功。若 scripts 为空或 memory_consumption === 0,大概率是路径写错、PHP 版本低于 7.4,或 AppPreloader.php 里用了 file_exists() 等非法操作。
- 错误现象:
Warning: Failed to preload ... because it contains a call to an undefined function→ 检查预加载脚本是否调用了未声明的函数(如dump()) - 错误现象:
opcache_get_status()返回false→ OPcache 根本没启用,回退检查php.ini路径和opcache.enable - 注意:FrankenPHP 的
classic模式(非 worker)不需要预加载,但性能提升有限,不推荐用于生产 Symfony 应用
真正容易被忽略的是:FrankenPHP 的 worker 模式和 OPcache 预加载是绑定关系,不是可选优化项。不配预加载,worker 就只是“延长寿命的 FPM”,类加载、容器重建这些重头戏照旧每请求来一遍。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











