twig模板缓存默认开启,dev环境下写入内存而非文件;真正禁用需同时满足:twig.yaml中设cache: false、app_env=dev且app_debug=true、执行cache:clear --env=dev并清空var/cache/dev/twig/目录。

模板缓存默认在哪?别被dev环境骗了
Symfony 3 的 Twig 模板缓存默认是开启的,哪怕你在 dev 环境下——它只是把缓存写进内存(cache.adapter.array),看起来像“没缓存”,其实编译后的 PHP 文件根本没生成。真正禁用,得从 Twig 编译层下手,不是改 cache.yaml 就完事。
禁用 Twig 缓存的三个关键配置点
只改一个地方,大概率无效。必须同时满足以下三点:
- 在
config/packages/twig.yaml中显式关闭缓存:twig:cache: false - 确保
APP_ENV=dev且APP_DEBUG=true—— 否则 Symfony 会强制启用缓存(即使你写了cache: false) - 清空当前环境缓存:
php bin/console cache:clear --env=dev
注意:不要加--no-warmup,warmup 过程会重新读取 Twig 配置
为什么改了还是有缓存?常见漏点
你以为关了,但 Twig 仍可能复用旧编译文件,原因通常是:
-
var/cache/dev/twig/目录没清干净 —— 手动删掉整个twig/子目录最保险 - 用了自定义 Twig 加载器(比如从数据库读模板),而该加载器自带缓存逻辑,
cache: false对它无效 - 在控制器里用了
$this->render('template.html.twig', [...]),但模板路径实际指向了src/Resources/views/...这类非标准位置,Twig 可能 fallback 到默认缓存策略 - PHP OPcache 开启且未禁用脚本缓存(
opcache.enable=1时,编译后的 PHP 模板文件仍会被 OPcache 缓存)—— 开发时建议临时设opcache.enable_cli=0并重启 PHP-FPM
上线前务必验证是否真禁用了
别只信配置,动手验证:
- 修改一个模板文件,刷新页面,看改动是否立即生效(不用清缓存、不用重启服务)
- 检查
var/cache/dev/twig/下是否仍有新生成的.php文件 —— 如果没有,说明禁用成功;如果有,说明某处配置仍生效 - 在模板里加一行
{{ dump(_context) }},如果报错 “dump is not a function”,说明 Twig 没加载 debug 扩展,可能连 dev 环境都没走对 —— 回头查APP_ENV和APP_DEBUG是否被.env.local覆盖
禁用模板缓存本身不难,难的是所有环节都对齐。尤其容易忽略的是 OPcache 和 .env.local 的覆盖行为,这两个点卡住,配十遍都没用。











