必须在 config_dev.yml 或 twig.yaml 中显式写 cache: false(yaml 布尔值),并确保 auto_reload: true 生效,否则模板修改不生效;ci 中须断言 twig.options.cache === false 且 last-modified 响应头存在。

twig.cache: false 必须写死在 config_dev.yml 里
开发时改了 base.html.twig 却没反应,不是缓存没清,而是配置根本没生效。Symfony 3 的 twig.cache 不是布尔开关,设成 null、~ 或留空都会 fallback 到默认路径(如 %kernel.cache_dir%/twig),而这个目录在 cache:warmup 后会被自动创建,实际仍启用磁盘缓存。
正确做法只有这一种:
- 在
config/packages/twig.yaml或config/config_dev.yml中显式写cache: false(YAML 字面量 false,不是字符串"false") - 确保该配置未被其他环境文件覆盖(比如
config/packages/prod/twig.yaml里写了cache: true,但 dev 下不该加载它) - 如果用了多个 Twig 实例(如 email 渲染单独配了一个
email_twig),每个都要单独加cache: false
auto_reload: true 缺失会导致“关了也白关”
即使 cache: false 写对了,若 auto_reload 被关掉或没生效,Twig 也不会监听文件修改时间,你保存模板后依然不会重新解析——看起来像“缓存还在起作用”。
auto_reload 默认为 true,但容易被以下情况覆盖:
- 某些 Docker Compose 配置里通过
environment:覆盖了APP_ENV,导致实际运行在 prod 模式,而 prod 下auto_reload强制为false - 本地用
php bin/console server:run启动时没加--env=dev,fallback 到 prod - IDE(如 PHPStorm)启用了“safe write”,保存时先写临时文件再原子替换,Twig 的
filemtime()检查失效
验证方式:删掉 var/cache/dev/twig/,改一个模板并刷新,用 ls -la var/cache/dev/twig/ 看是否生成新文件 —— 如果没生成且页面更新了,说明 cache: false 生效;如果没生成但页面没更新,大概率是 auto_reload 失效。
CI/CD 中必须断言 twig.options.cache === false
本地配置正确 ≠ 团队所有环境一致。CI 流水线里常见破环点:有人提交了 config_dev.yml 但 CI 用的是 APP_ENV=test,加载了另一套配置;或缓存卷残留旧配置。
应在 CI 脚本中加入硬性检查:
- 运行
php bin/console debug:container --parameter=twig.options,grep 输出确认"cache":false(注意是 JSONfalse,不是null或路径字符串) - 请求一个已知模板路由(如
/_profiler),用curl -sI http://app/_profiler | grep -i 'last-modified'验证响应头是否存在 —— 缺失说明auto_reload未触发或缓存引擎仍在工作
这两项不通过就中断构建。靠“大家记得清缓存”不可控,靠配置+断言才可靠。
Windows 和 Docker 下的隐性陷阱
路径权限和时区问题会让缓存行为变得诡异,尤其在协作场景下容易被忽略:
- Windows 上杀毒软件或 OneDrive 可能锁定
var/cache/dev/twig/目录,导致file_put_contents()报Permission denied,Twig 回退到内存缓存(ArrayCache),表现像“部分生效” - Docker 容器内
var/cache若没挂载为可写卷,或宿主机与容器时区不同,filemtime()返回时间戳偏差超过 1 秒,Twig 会误判文件未更新 - 某些 IDE 的“安全写入”选项在保存时绕过文件系统监听,需手动关闭(PHPStorm:Settings → System Settings → Use “safe write” → 取消勾选)
真正麻烦的不是关不掉缓存,而是有人改了模板却不知道队友的机器正从 var/cache/dev/twig/abc123.php 里读旧代码 —— 所以 cache: false 必须写死,CI 断言必须跑通,否则协作成本远高于那点启动延迟。











