Symfony 3 的 Twig 编译缓存默认仅在 APP_ENV=prod 且 debug=false 时启用,开发环境(debug=true)下每次请求都会重新编译模板;确认方法是执行 php bin/console about 查看 Environment 和 Debug 状态,并检查 twig.yaml 中是否显式配置 cache 或 auto_reload。

Symfony 3 默认不缓存 Twig 模板,但如果你手动启用了模板缓存(比如改过 twig 配置),或者误用了生产环境配置,就可能出现改了 .html.twig 文件却没生效的情况——这不是“关不关”的问题,而是“有没有被意外激活”以及“是否在 debug=false 下误判了行为”。
确认当前是否真在用 Twig 模板缓存
Symfony 3 的 Twig 编译缓存默认只在 APP_ENV=prod 且 debug=false 时启用,开发环境(debug=true)下每次请求都会重新编译模板。所以第一步不是去“关闭”,而是确认你看到的“不刷新”是不是因为:
- 实际运行在
prod环境(比如用php -S启动却没设APP_ENV=dev) - 浏览器或反向代理返回了旧的 HTTP 响应(304 或强缓存),压根没发新请求到 Symfony
- 你清的是
var/cache/dev/,但应用跑在prod下,该清var/cache/prod/
php bin/console about,看输出中 Environment 和 Debug 两行;再检查 config/packages/twig.yaml 是否有显式配置 cache: '%kernel.cache_dir%/twig' 或 auto_reload: false。
强制禁用 Twig 编译缓存(仅限开发)
如果确需在开发中彻底跳过 Twig 缓存(例如调试模板加载逻辑、或配合某些热重载工具),不要删缓存目录,而是在 config/packages/twig.yaml 中覆盖关键参数:
twig:
cache: false
auto_reload: true
注意:cache: false 表示不写入任何编译后 PHP 模板文件,每次解析都从源文件开始;auto_reload: true 是 debug 模式默认值,但显式写出更保险。
- 这个设置在
prod下无效——Symfony 会忽略cache: false并强制使用缓存 - 若用的是
framework.twig配置方式(老项目),对应键是twig.cache和twig.debug - 改完必须清一次缓存:
php bin/console cache:clear --env=dev,否则旧缓存仍可能被加载
改了模板不生效?先排除非 Twig 层干扰
90% 的“模板不刷新”问题和 Twig 缓存无关,而是卡在更外层:
-
APP_DEBUG=false但APP_ENV=dev—— 此时 Twig 不缓存,但 Symfony 容器、路由等仍走缓存,可能导致控制器没重载,模板根本没被调用 - Web 服务器(Nginx/Apache)返回了 304,或设置了
Cache-Control: max-age=3600,浏览器直接读本地副本 - PHP opcache 启用且未配置
opcache.validate_timestamps=1,导致已编译的var/cache/*/twig/*.php文件被长期复用 - 你改的是
templates/bundle/xxx.html.twig,但实际渲染的是templates/override/xxx.html.twig(被主题或 bundle override 覆盖了)
{{ dump('DEBUG-' ~ random()) }},刷新页面看是否变值。不变 → 是 HTTP 或 opcache 问题;变 → Twig 本身在工作,问题出在逻辑或路径。
真正难处理的不是“怎么关”,而是关了之后发现还是旧内容——这时候得一层层查 HTTP 头、opcache 状态、bundle 加载顺序,而不是反复清 var/cache。


















