dev环境下twig缓存默认关闭,但会生成临时编译文件;设cache: false可彻底禁用编译缓存目录,避免写入var/cache/dev/twig/,仅影响模板编译,不影响其他缓存机制。

dev环境下Twig缓存默认是关的,但为什么还看到缓存文件?
因为debug: true时Twig确实不启用编译缓存——但它仍会把模板编译成PHP代码写入var/cache/dev/twig/目录,只是每次请求都强制重新编译、不复用。你看到的那些.php文件不是“生效的缓存”,而是临时编译产物,删了也不影响运行。真要彻底禁用,得让Twig连这个目录都不写。
怎么让Twig在dev环境完全跳过编译缓存目录
在config/packages/twig.yaml里把cache设为false,不是空字符串或null,必须是布尔false:
twig:
default_path: '%kernel.project_dir%/templates'
cache: false
这样Twig会跳过整个缓存路径初始化逻辑,var/cache/dev/twig/下不会再生成任何文件。注意:这仅影响模板编译缓存,不影响Symfony自身的服务容器或路由缓存。
cache: false之后模板变慢?那是预期行为
关闭编译缓存后,每次请求都会重新解析.twig文件、生成PHP代码、再执行——这是开发调试需要的“所见即所得”。如果觉得慢,说明你可能:
- 模板嵌套太深或用了大量
{% include %}和{% extends %} - 启用了
auto_reload: true(默认就是true),但文件系统监听有延迟(尤其Windows + WSL) - 误把
debug: false留在dev环境,导致Twig进入“伪生产模式”
检查APP_DEBUG是否为true,以及bin/console debug:container --env=dev | grep twig输出中cache字段是否确实是false。
别混淆:Twig缓存和Symfony应用级缓存是两回事
cache: false只管Twig模板编译;它不会影响cache.app服务、HTTP响应缓存,也不会让{% cache %}标签失效。如果你在模板里写了:
{% cache 'sidebar' 3600 %}
{{ render(controller('App\Controller\SidebarController::index')) }}
{% endcache %}
这段仍会走cache.app适配器(比如cache.adapter.filesystem),和Twig编译缓存无关。想关掉它,得单独配置framework.cache.app: null或换用cache.adapter.array。
真正难搞的是缓存路径权限和auto_reload在Docker或WSL下的表现——它们不报错,但会让“关闭缓存”的效果看起来像没关。











