Symfony 3 默认仅在 production 环境(debug=false)下生成 Twig 模板缓存文件;dev 环境 debug=true 时模板实时解析、不写入编译缓存,var/cache/dev/twig/ 中文件属运行时 AST 缓存,不影响热更新,模板不生效主因通常是浏览器/CDN/OPcache 等外部缓存未清除。

Symfony 3 默认不生成 Twig 模板缓存文件——它只在 debug=false(即生产环境)时才把模板编译为 PHP 文件并缓存到 var/cache/prod/twig/。开发环境下 debug=true,Twig 每次都会重新解析源模板,根本不会写入缓存文件。所以“重写内核文件来关闭模板缓存”不仅没必要,还可能破坏框架稳定性。
为什么你看到 var/cache/dev/twig/ 下有文件?
这些不是“模板缓存”,而是 Twig 自身的运行时缓存(如模板 AST、加载器映射),属于正常行为,不影响开发时模板热更新。只要 APP_DEBUG=true,改完 .html.twig 文件刷新页面就能立刻生效。
- 检查当前是否真在 dev 环境:运行
php bin/console debug:container --env=dev | grep debug,确认输出中debug: true - 确认
.env中设了APP_ENV=dev和APP_DEBUG=true,且未被.env.local覆盖 - 如果误设了
APP_DEBUG=false,即使APP_ENV=dev,Twig 也会启用模板编译缓存——这是最常见误判点
模板不更新的真实原因通常是缓存层错位
你以为是模板缓存没关,其实是其他缓存挡在了前面,导致请求根本没进 Twig:
- 浏览器缓存:按 Ctrl+F5 强刷,或临时禁用(DevTools → Network → Disable cache)
- 反向代理 / CDN 缓存:检查响应头是否有
X-Cache: HIT或Cache-Control: public, max-age=3600 - HTTP 缓存中间件:控制器里写了
$response->setPublic()->setMaxAge(3600)却忘了在开发时注释掉 - OPcache:PHP 的字节码缓存可能缓存了已编译的 Twig 模板 PHP 文件,执行
sudo systemctl restart php-fpm或opcache_reset()可验证
真要禁用 Twig 编译缓存(仅限极端调试场景)
不推荐,但若必须绕过所有 Twig 缓存逻辑(包括 debug 模式下的 AST 缓存),可在 config/packages/twig.yaml 中强制覆盖:
twig: cache: false auto_reload: true strict_variables: true
注意:cache: false 是布尔值,不能写成字符串 'false';它会让 Twig 完全跳过文件系统写入,但会轻微拖慢每次渲染——仅用于排查缓存污染问题,切勿长期开启。
真正该盯紧的是环境变量和 HTTP 缓存链路,而不是动内核或删 Twig 目录。模板不更新,90% 是缓存没清对地方,不是模板缓存关不关的问题。


















