symfony生产环境twig模板缓存需手动清理或禁用:默认写入var/cache/prod/twig,仅清cache:clear无效,须删该目录或设cache: false并重启php-fpm。

模板缓存不关,改完 Twig 文件上线后页面还是旧的——这不是浏览器缓存,是 Symfony 自己把编译后的 PHP 模板存起来了。
dev 环境下模板缓存默认关闭,但 prod 必须手动干预
Symfony 3 的 Twig 模板缓存行为完全由 debug 配置驱动:dev 环境设 debug: true(默认),Twig 就跳过缓存、每次重编译;prod 环境 debug: false,缓存强制启用且默认写入 %kernel.cache_dir%/twig。别指望“改完模板自动刷新”,它根本不会。
- 检查当前环境是否真为 prod:运行
php bin/console debug:container --env=prod,确认输出里kernel.debug是false - 确认 Twig 缓存路径:查看
config/packages/twig.yaml是否显式配置了cache:,没配就走默认路径 - 不要只清
cache:clear—— 它清的是服务/元数据缓存,Twig 编译文件得单独删或禁用
临时关闭模板缓存:仅限调试或灰度发布
关掉 Twig 缓存不是性能优化,而是确保“所见即所得”。但在 prod 关闭会拖慢首屏渲染(每次请求都要解析+编译 .twig),只建议在版本刚上线、怀疑模板未生效时用。
- 在
config/packages/prod/twig.yaml中加一行:cache: false - 或者更细粒度控制:设为
cache: '%kernel.cache_dir%/twig_dev'(指向一个空目录,避免污染主缓存) - 改完必须重启 Web 服务器(PHP-FPM 或 Apache)——Twig 缓存是进程级的,不清除 worker 进程内存里的 opcode 缓存,新配置不生效
清空已存在的 Twig 缓存文件
就算你改了配置,旧的编译文件还在磁盘上,下次请求可能仍被加载(尤其当 cache 路径没变、且文件权限允许读取时)。
- 直接删目录:
rm -rf var/cache/prod/twig(注意路径中的prod要和当前环境一致) - 用命令行清理(Symfony 3.4+ 支持):
php bin/console twig:cache:delete --env=prod - 如果用了 APCu 做 opcode 缓存,还得执行
apcu_clear_cache()或重启 PHP-FPM,否则编译后的 PHP 字节码还在内存里
上线后模板仍不更新?先查这三处
模板“看起来没更新”,90% 不是缓存问题,而是路径、命名空间或加载顺序错了。
-
templates/下的文件名是否和render('xxx.html.twig')中的路径完全一致(含大小写、扩展名) - 是否误用了
include或extends加载了老版本的 base 模板(比如base_old.html.twig) - 有没有多个 bundle 定义了同名模板?Doctrine 和 Twig 都按 bundle 加载顺序覆盖,
AppBundle必须排在其他 bundle 前面才能生效
真正麻烦的不是关不关缓存,而是关了之后发现模板压根没被 Twig 扫描到——这时候再回去查 twig.paths 配置和文件权限,比反复清缓存有用得多。











