必须显式设 cache: false,仅开 debug: true 不起作用,因为 Symfony 的 debug 开关不影响 Twig 缓存机制;Twig 在 dev 环境默认仍启用缓存,需配合 auto_reload: true 并关闭 safe write、确保 Docker 卷可写及时区一致。

必须显式设 cache: false,仅开 debug: true 不起作用。
为什么 debug: true 不能自动关 Twig 缓存
Symfony 的 debug 开关只影响错误显示、Profiler、容器热加载等,Twig 自己的缓存引擎默认在 dev 环境下仍启用——它把模板编译成 PHP 文件存在 var/cache/dev/twig/ 下,后续请求直接 include 这些文件。所以你改了 base.html.twig,页面却没变,不是浏览器问题,是 Twig 根本没重新解析。
常见误操作包括:
- 把
cache: ~或cache: null当作关闭(YAML 解析后会被合并为默认路径,实际仍启用) - 写成
cache: "false"(字符串,Twig 会把它当路径去创建目录) - 只改了
config.yml却没配config_dev.yml,结果环境没生效
正确配置 cache: false 并验证是否生效
在 app/config/config_dev.yml 中定位到 twig: 块,确保包含这两行:
twig:
cache: false
auto_reload: trueauto_reload: true 是关键配合项:它让 Twig 每次请求前用 filemtime() 检查源文件是否变更,再决定是否重编译。若关了它,即使 cache: false,Twig 也不会感知保存动作。
验证是否真关掉了:
- 删掉
var/cache/dev/twig/目录 - 改一个模板文件(比如加个
{{ dump() }}) - 刷新页面,检查
var/cache/dev/twig/是否有新生成的 PHP 文件 —— 如果没有,说明关成功了
Docker、IDE 和时区带来的隐藏陷阱
即使配置正确,也可能因环境细节失效:
- PHPStorm 默认开启 “safe write”,保存时先写临时文件再原子替换,Twig 的
filemtime()监听不到变更 —— 需在 Settings → Appearance & Behavior → System Settings 中关闭 “Use safe write” - Docker 容器中,
var/cache必须挂载为可写卷;否则 Twig 回退到内存缓存(ArrayCache),表现像“有时生效有时不” - 宿主机与容器时区不一致会导致
filemtime()返回时间戳错乱,Twig 误判文件未更新 —— 推荐统一设为Europe/Berlin或 UTC,并在docker-compose.yml中加environment: - TZ=Europe/Berlin
CI/CD 中必须断言的两项检查
协作开发里最麻烦的不是你本地没关掉,而是别人改了模板,你却在读他上周编译的缓存。所以 CI 脚本里要硬性校验:
- 运行
php bin/console debug:container --parameter=twig.options,grep 输出确认"cache" => false(不是null,不是路径字符串) - 用
curl -sI http://app/_profiler | grep Last-Modified,必须有响应头 —— 没这个头,说明auto_reload没生效或被覆盖
真正卡住人的从来不是怎么配,而是没人检查配置有没有被 Docker 覆盖、被 IDE 干扰、被 CI 忽略。把 cache: false 写死在 config_dev.yml,再加一条 CI 断言,比每次问“你清缓存了吗”管用得多。


















