关掉模板缓存需同时修改配置并清缓存:在twig.yaml设cache: false后,必须执行php bin/console cache:clear --env=dev/prod,否则twig实例仍加载旧编译文件;硬编码缓存路径会覆盖配置,需检查kernel.php等处。

模板缓存关了但页面还是旧的,怎么回事
关掉模板缓存不等于立刻生效——Twig 编译后的 PHP 文件仍留在 var/cache/dev/twig/ 或 var/cache/prod/twig/ 里,下次请求直接加载旧编译文件。你改了 Twig 模板,但没清缓存目录,它就继续用原来的 PHP 代码跑。
怎么真正禁用 Twig 模板缓存
在 config/packages/twig.yaml 中设 cache: false 是基础,但必须配合环境配置才起作用:
- 开发环境(
dev)下,cache默认是%kernel.cache_dir%/twig,设为false后 Twig 会跳过写入,但不会自动删已有文件 - 生产环境(
prod)下,即使设cache: false,若之前已生成过缓存,仍可能被加载——因为 Symfony 的容器缓存和 Twig 缓存是两层,容器缓存没清,Twig 服务实例可能还拿着旧的编译器引用 - 正确做法:先改配置,再执行
php bin/console cache:clear --env=dev(或--env=prod),否则cache: false不会被重新注入到 Twig 实例中
为什么清空 var/cache 目录不是必须的
关闭模板缓存后,Twig 不再生成新文件,但旧文件留着也不影响——只要不手动 require 它、不通过 Twig_Loader_Filesystem 的缓存路径去加载,就不会被执行。关键在于:
-
cache: false会让Twig_Environment的getLoader()返回一个不带缓存逻辑的 loader,绕过所有已存在的 .php 编译文件 - 如果你同时用了
auto_reload: true(dev 环境默认开启),Twig 每次都会重新解析源模板,根本不会查缓存目录 - 所以“无需手动清空目录”成立的前提是:配置已生效 + 环境缓存已刷新。没做这两步,光删
twig/子目录只是临时掩盖问题
容易被忽略的硬编码缓存路径
有些老项目在 src/Kernel.php 或自定义 Twig 服务定义里,硬编码了 setCache() 路径,比如:
new \Twig\Loader\FilesystemLoader($this->getParameter('kernel.project_dir').'/templates', $this->getCacheDir().'/twig')
这种写法会覆盖 YAML 配置,导致 cache: false 完全无效。检查是否有类似代码,优先删掉或改成条件判断:
if ($this->isDev()) {
$loader->setCache(false);
}
模板缓存是否真关了,不能只看配置文件,得确认 Twig 实例实际用的 loader 是否跳过了缓存路径——最稳的方式是加一行 dump($twig->getLoader()->getCache()); 看输出是不是 null 或 false。











