frankenphp 的 worker 模式导致 twig 缓存不更新,因 php 进程常驻内存,模板修改后不会自动重载编译文件;需禁用 worker(开发)或配合 cache:warmup 与进程重启(生产),并显式配置 auto_reload 和 twig.cache_loader 行为。

为什么 Symfony 模板缓存不更新在 FrankenPHP 里特别明显
因为 FrankenPHP 的 worker 模式会让 PHP 进程常驻,Twig 编译后的模板文件(var/cache/prod/twig/xxx.php)被加载进内存后不会自动重载——这和 PHP-FPM 每次请求都重新初始化不同。你改了 templates/base.html.twig,但页面还是旧的,不是缓存没清,是 PHP 进程根本没重新编译 Twig 模板。
检查是否真在 worker 模式下运行
先确认问题根源:FrankenPHP 默认启用 worker 模式,但 Symfony 的缓存行为会因此改变。运行 frankenphp --version 看输出里有没有 worker 字样;更直接的是查进程:ps aux | grep frankenphp,如果看到 --worker 参数或多个 php-worker 子进程,那就坐实了。
- 开发环境建议显式禁用:
frankenphp php-server --no-worker - 生产环境不能关 worker,得靠缓存策略兜底
-
--no-worker模式下行为接近传统 FPM,模板修改后刷新即生效(但性能下降)
Symfony 配置必须加 auto_reload 和 strict_variables
仅靠 APP_ENV=dev 不够。FrankenPHP 的常驻进程会绕过 Symfony 默认的 dev 检测逻辑,必须手动强化 Twig 配置:
framework:
twig:
auto_reload: '%kernel.debug%'
strict_variables: '%kernel.debug%'
-
auto_reload: true强制 Twig 每次请求检查模板文件 mtime,但仅当cache: false或缓存目录不可写时才真正生效 - 确保
var/cache目录可写,且APP_ENV=dev时kernel.debug=true - 线上不要设
auto_reload: true,会拖慢性能;应配合缓存清理流程
生产环境模板更新的正确姿势
别依赖“改完就生效”,要主动触发重建。FrankenPHP 没有类似 php-fpm reload 的平滑重启命令,worker 进程只能杀掉重拉:
- 部署脚本里加一步:
rm -rf var/cache/prod/twig/* && php bin/console cache:warmup --env=prod - 然后发信号重启 FrankenPHP:
kill -USR2 $(cat /path/to/frankenphp.pid)(前提是启用了 pidfile) - 或者更稳妥:用
systemctl restart frankenphp(如果你用 systemd 管理) - 注意:
cache:warmup必须在 FrankenPHP 进程外执行,否则常驻进程会锁住缓存文件
最易被忽略的一点:Symfony 的 twig.cache_loader 默认为 true,它会让 Twig Loader 也常驻内存。如果模板路径结构变了(比如新增了 templates/blocks/),光清缓存不够,必须重启 worker 进程才能让 Loader 重新扫描目录。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











