必须在 config/packages/twig.yaml 中显式配置 cache: false 才能真正关闭 Twig 模板缓存,因为 debug: true 不影响 Twig 缓存,默认仍启用;cache: ~、null 或空字符串均无效。

为什么 debug=true 还要手动关 cache
Symfony 的 debug: true 控制的是错误页面、Profiler、容器热加载等,但 Twig 缓存是独立开关,默认在 dev 环境下依然启用——它会把 .twig 文件编译成 PHP,写进 var/cache/dev/twig/,下次请求直接 include 这个 PHP 文件。你改了模板却没反应,不是浏览器缓存,是 Twig 在读旧的编译结果。
怎么真正关掉 Twig 模板缓存
必须在 config/packages/twig.yaml 里显式写死:cache: false。这不是可选配置,而是唯一可靠方式:
-
cache: ~或cache:(空值)会被 Symfony 合并为默认路径,实际仍启用缓存 -
cache: null或cache: ""同样无效,YAML 解析后不触发禁用逻辑 - 如果用了多个 Twig 实例(比如单独配了
email_twig),每个都要单独设cache: false
示例配置片段:
twig:
cache: false
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'
验证是否真的关成功了
别只看页面刷新有没有变化——那是假象。真验证得看磁盘和行为:
- 删掉
var/cache/dev/twig/目录 - 改一个
.twig文件并保存 - 刷新页面,检查
var/cache/dev/twig/是否有新 PHP 文件生成 → 没有,说明关成功了 - 同时确认响应头含
Last-Modified→ 没有,大概率auto_reload: true没生效或被覆盖
Windows 用户额外注意:safe write(如 PHPStorm 默认开启)会导致先写临时文件再原子替换,Twig 监听不到变更,需在 IDE 设置里关掉。
关掉之后要注意什么
每次请求都重新解析 .twig 文件,性能下降明显,尤其模板多、继承深时:
- 仅限本地开发调试逻辑和语法,上线前务必恢复缓存
- 若用 Docker,确保
var/cache是可写卷,且宿主机与容器时区一致,否则filemtime()判断失效,可能误判文件未更新 - 某些 CI 流水线会跳过 dev 配置,建议加断言:运行
php bin/console debug:container --parameter=twig.options,检查输出中cache值是否为false(不是null或路径字符串)
最麻烦的从来不是“怎么关”,而是有人改了 base.html.twig 却不知道队友的机器正从 var/cache/dev/twig/abc123.php 里读旧代码——cache: false 写死 + CI 断言,比问“你清缓存了吗”管用得多。











