必须显式设twig: cache: false(YAML布尔字面量)并确保auto_reload: true,否则Twig仍读取var/cache/dev/twig/下旧编译文件;需删缓存目录验证无新PHP文件生成,CI中应断言debug:config twig输出含cache: false。

为什么改了.twig文件没反应?
不是浏览器缓存,也不是服务器没重启——是 Twig 正在读 var/cache/dev/twig/ 下已编译的 PHP 文件。即使 APP_ENV=dev 且 APP_DEBUG=true,Twig 默认仍启用模板编译缓存,auto_reload: true 也只在缓存“有效”时才去比对文件修改时间;一旦缓存存在且未过期,它就直接执行旧编译结果。
怎么真正关闭 Twig 模板缓存?
必须显式设 cache: false,不能留空、不能注释、不能写成 "false"(字符串)或 null。YAML 的布尔字面量才生效:
twig:
cache: false
auto_reload: true
-
cache: false是唯一绕过所有默认路径逻辑的方式;设成%kernel.cache_dir%/twig或~都会被 Symfony 合并为实际路径,缓存照常工作 - 若项目用了多个 Twig 实例(如邮件模板单独配了
email_twig),每个都要单独加cache: false - Windows 下注意杀毒软件或 IDE(如 PHPStorm)可能锁定
var/cache/dev/twig/目录,导致file_put_contents()权限拒绝,关缓存后反而报错
如何验证缓存真的关掉了?
别只看页面有没有变——要确认缓存目录是否停写:
- 删掉
var/cache/dev/twig/整个目录 - 改一个
.twig文件并保存 - 刷新页面,再检查该目录:如果没生成任何新 PHP 文件(比如
abc123.php),说明关成功了 - 如果目录里又冒出文件,说明配置没生效,或者环境没走对(比如实际运行在
prod)
CI 流水线里可加断言:php bin/console debug:config twig | grep "cache: false",避免本地能跑、上线就卡住。
关掉之后为什么还是慢或不生效?
关缓存只是让每次请求都重新解析模板,但不解决其他干扰项:
- IDE “safe write” 开启时,先写临时文件再原子替换,Twig 的
filemtime()检查可能错过变更 —— 关掉 IDE 的安全写入选项 - Docker 环境下,宿主机和容器时区不一致会导致
filemtime()返回错误时间,缓存误判未更新 —— 统一时区,并确保var/cache是可写卷 - 用了自定义
Twig\Loader或手动 newTwig\Environment,那 config 中的cache: false对它完全无效 —— 这类实例必须自己传['cache' => false]
最常被忽略的一点:关缓存 ≠ 模板逻辑自动热更新。比如宏({% macro %})、全局函数、扩展类的 PHP 代码改了,仍需重启 Web Server 或清 OPCache,否则 Twig 解析的是旧 PHP 字节码。











