Twig缓存不由twig.yaml的cache选项控制,而是由kernel.debug值决定:debug=true时缓存至var/cache/dev/twig/,debug=false时缓存至var/cache/prod/twig/;真正实现热更新的是auto_reload:true,它通过校验模板文件修改时间触发重编译。

Twig模板缓存不能靠改yml文件“关闭”,它由debug环境开关控制,且缓存路径、编译逻辑全在PHP层硬编码——直接删var/cache或设debug=false反而会让缓存更顽固。
为什么改twig.yaml里的cache选项没用
Twig缓存不是靠配置开关启停的。Symfony 3中,twig.cache这个配置项只影响cache.adapter的选择(比如用filesystem还是array),但真正决定“是否生成缓存文件”的,是kernel.debug值。只要debug=true(开发环境默认),Twig就会把模板编译成PHP文件并写入var/cache/dev/twig/;设成false后,它依然会缓存——只是换到var/cache/prod/twig/,且不自动刷新。
常见误操作:
- 在config/packages/twig.yaml里写cache: false → Twig无视该字段,照常缓存
- 把cache: '%kernel.cache_dir%/twig'改成cache: null → 启动报错,因为Twig要求缓存路径必须是字符串
想让模板每次重编译,只有一种可靠方式
强制Twig跳过缓存检查,必须让Twig\Loader\FilesystemLoader每次返回新内容,而不是复用已编译的PHP类。这只能通过运行时行为干预:
- 开发时加环境变量:
APP_DEBUG=1+SYMFONY_DEPRECATIONS_HELPER=weak(确保debug开启) - 清空Twig专属缓存目录:
rm -rf var/cache/*/twig(注意:仅清twig子目录,别动整个cache,否则服务容器也会重建) - 在
config/packages/dev/twig.yaml中显式指定编译器为Twig\Environment::create的调试模式:twig: options: cache: '%kernel.cache_dir%/twig' auto_reload: true strict_variables: true
其中auto_reload: true才是关键——它让Twig在每次请求前校验源文件mtime,变化则重编译
生产环境千万别关模板缓存
关掉Twig缓存等于放弃性能底线。一个未缓存的Twig模板,每次请求都要经历词法分析、语法树构建、PHP代码生成、include执行四步,比缓存版本慢5–10倍。如果你真遇到模板修改不生效:
- 先确认是否部署了旧代码(
git status、ls -l src/Templates/) - 检查
var/cache/prod/twig/下对应哈希文件的修改时间是否晚于模板文件 - 不要改
debug值来“测试”,而应执行:php bin/console cache:clear --env=prod && php bin/console cache:warmup --env=prod,再验证
最易被忽略的点:即使你清了twig目录,如果kernel.debug为false,Twig仍会从opcode缓存(如OPcache)里加载已编译的PHP类——这时要重启PHP-FPM或清OPcache,不是清Symfony缓存。


















