必须在 config/packages/twig.yaml 中显式配置 cache: false 才能关闭 twig 模板缓存,因为 debug=true 不影响 twig 缓存机制;验证需删除 var/cache/dev/twig/ 后确认无新 php 文件生成。

为什么 debug=true 还要手动关 cache
因为 debug=true 只影响 Symfony 的错误显示、Profiler 和容器热加载,和 Twig 自身的模板编译缓存无关。Twig 默认在 dev 环境下仍会把 .twig 文件编译成 PHP 并写入 var/cache/dev/twig/,你改了模板却没刷新,大概率就是它在读旧的编译文件。
真正关闭 Twig 模板缓存的唯一方式
必须在 config/packages/twig.yaml 中显式写死:cache: false。这不是可选配置,而是硬性开关:
-
cache: null或cache: ~会被 Symfony 合并为默认路径,实际仍启用缓存 -
cache: ""(空字符串)不被识别为禁用,可能触发异常或 fallback 到内存缓存 - 若用了多个 Twig 实例(如单独配了
email_twig),每个都要单独设cache: false
验证是否关成功的关键动作
别只信配置写了,得看行为:
- 删掉
var/cache/dev/twig/目录后,改一个模板并刷新页面,该目录里**不应生成任何新 PHP 文件** - 若用 Docker,确认
var/cache是可写卷,且宿主机与容器时区一致,否则filemtime()判断失效会导致缓存误判 - 某些 IDE(如 PHPStorm)默认开启 “safe write”,保存时先写临时文件再原子替换,Twig 监听不到变更——需在 IDE 设置中关闭该选项
关掉之后的真实代价
每次请求都会重新解析 .twig 文件,启动变慢是必然的。这不是 bug,是调试期的合理取舍。但要注意:
- 不要在生产环境留着
cache: false,它绕过了所有性能保护 - 若只是调样式或小逻辑,又嫌全关太慢,可折中用内存适配器:
cache.adapter.array,既避免磁盘 I/O,又不保留持久化编译结果 - 最麻烦的不是关不掉,而是你改了
base.html.twig,队友的机器还在读var/cache/dev/twig/abc123.php—— 所以必须把cache: false写死在 config,并纳入 CI 检查











