twig.cache: false 是唯一可靠禁用 twig 编译缓存的写法;cache: ~、cache: null 或删除该行均会回退至默认缓存路径,加引号的 "false" 会被当作字符串路径导致权限错误。

twig.cache: false 是唯一可靠写法,不是注释或留空
设 cache: false 才真正禁用 Twig 编译缓存;写成 cache: ~、cache: null 或直接删掉这行,Symfony 都会 fallback 到默认路径(如 var/cache/dev/twig/),缓存照常工作。YAML 的 false 是布尔字面量,不能加引号,否则变成字符串 "false",Twig 会把它当路径处理并尝试写入,大概率报 file_put_contents(): Permission denied。
必须同时验证 auto_reload: true 是否生效
auto_reload: true 控制 Twig 是否每次请求都检查 .twig 文件的修改时间(filemtime())。它默认开启,但若被覆盖(比如在 config/packages/twig.yaml 中显式写了 auto_reload: false),即使 cache: false,改了模板也不会自动重载——你得手动刷新两次或清浏览器缓存才可能看到变化。
- 检查方式:执行
php bin/console debug:container --parameter=twig.options,确认输出中"auto_reload" => true - Docker 环境下注意宿主机与容器时区一致,否则
filemtime()返回值错乱,auto_reload判定失效 - PHPStorm 用户需关闭设置里的 “Safe write”,否则保存时先写临时文件再替换,Twig 监听不到变更事件
验证缓存是否真关掉了:看 var/cache/dev/twig/ 是否静默
关成功的标志不是页面变快或变慢,而是 var/cache/dev/twig/ 目录彻底“躺平”:删掉它,改一个 .twig 文件并刷新页面,目录里**没有新 PHP 文件生成**。如果仍有 abc123.php 类文件出现,说明 cache: false 没生效,或被其他配置(如自定义 Twig 环境)覆盖。
- 常见干扰项:
config/packages/dev/twig.yaml与config/packages/twig.yaml同时存在,后者优先级更高,容易误改错文件 - 用了多个 Twig 实例(如邮件模板单独配了
email_twig),每个都要单独设cache: false - Windows 下杀毒软件可能锁定
var/cache/目录,导致写失败但又不报明确错误,表现为“有时生效有时不”
别信 APP_ENV=dev 就万事大吉
环境变量只是开关之一,实际行为由配置文件最终决定。有人本地 .env 写着 APP_ENV=dev,但 config/packages/twig.yaml 里没配 cache: false,结果还是走缓存;CI 流水线里若没断言 twig.options.cache === false,就可能上线带缓存的 dev 配置,导致测试环境渲染出旧模板。
- 强制手段:在
config/packages/dev/twig.yaml中写死cache: false,比依赖环境推导更可靠 - CI 中加检查:用
php bin/console debug:container --parameter=twig.options | grep '"cache" => false'断言配置落地 - 不要用
cache: "%kernel.cache_dir%/twig"这类动态路径——%kernel.cache_dir%在不同机器上指向不同位置,且 warmup 后该目录必然存在,等于变相启用缓存
cache: false 写成了 cache: "false"。











