必须确认debug=false且APP_ENV=prod才启用Twig缓存;dev环境下debug=true时Twig默认跳过缓存,每次重新编译,故“关缓存”实为多余;强制禁用需在twig.yaml中设cache: false并执行cache:clear。

模板缓存关不掉?先确认是不是真在用 Twig 缓存
Symfony 3 默认启用 Twig 模板缓存,但前提是 debug 为 false 且环境是 prod。如果你在 dev 环境下改了模板却没立刻生效,大概率不是缓存没关,而是你根本没触发 Twig 缓存——因为 debug=true 时 Twig 会跳过缓存、每次重新编译。所以第一步:运行 php bin/console debug:container --env=dev | grep debug,确认输出里 debug: true 存在。如果已经是 true,那“关缓存”这步其实多余,你看到的就是实时模板。
强制禁用 Twig 缓存的两种可靠方式
真要临时绕过 Twig 缓存(比如怀疑缓存文件损坏、或想对比编译前后行为),不能只靠改环境变量,得从 Twig 配置层下手:
- 修改
config/packages/twig.yaml,显式把cache设为false:twig: cache: false
- 或者更彻底:设为
null或一个不存在的目录(如/tmp/nowhere),让 Twig 初始化失败后退回到无缓存模式 - 改完必须清缓存:
php bin/console cache:clear --env=dev;否则旧缓存文件仍可能被加载
注意:cache: false 只影响 Twig 模板编译缓存,不影响 Symfony 容器、路由、HTTP 缓存等其他层级。
为什么 cache:clear 不一定能清掉 Twig 编译文件
Symfony 的 cache:clear 命令默认只清 var/cache/{env}/ 下的容器、路由等缓存,而 Twig 编译后的 PHP 文件默认放在 var/cache/{env}/twig/ ——这个目录是否被清理,取决于你的 Twig 配置中 cache 项指向哪。如果它被显式配置为 /tmp/twig-cache 或其他路径,cache:clear 就完全不会碰它。
- 手动检查:
ls -la var/cache/dev/twig/,看是否有大量.php文件存在 - 手动清理更保险:
rm -rf var/cache/*/twig(开发环境可用,生产慎用) - 验证是否生效:改一个模板文件,刷新页面,再看
var/cache/dev/twig/下对应哈希文件的修改时间是否更新
容易忽略的副作用:debug=true 时 Twig 仍可能“伪缓存”
即使 debug=true,Twig 也会把模板内容读入内存并复用,尤其当模板含 {% include %} 或 {% extends %} 时,父模板可能被意外复用。这不是磁盘缓存,而是 PHP 进程内引用。
- 最干净的排错方式:每次改完模板后,重启 Web 服务器(如
symfony server:stop && symfony server:start)或 CLI 内置服务器 - 若用 Apache/Nginx,确保没有启用 OPCache 并缓存了 Twig 编译后的 PHP 文件(可临时加
opcache.enable=0到php.ini验证) - 线上环境切勿长期关闭 Twig 缓存——编译耗时会从毫秒级升到百毫秒级,QPS 直接腰斩


















