要彻底关闭Twig模板缓存,必须在twig.yaml中显式配置cache: false(布尔值),并验证var/cache/dev/twig/目录不再生成文件,否则缓存仍生效。

为什么改了 .twig 文件却没反应
不是你的编辑器没保存,也不是浏览器缓存,大概率是 Twig 缓存还在工作——即使 APP_DEBUG=true 且 APP_ENV=dev,Twig 默认仍会把编译后的 PHP 文件写进 var/cache/dev/twig/,下次请求直接加载它,跳过模板解析。
-
debug: true控制的是错误显示、Profiler、容器热更新,不控制 Twig 缓存 - 仅清空
var/cache/dev/不够:缓存目录重建后 Twig 会立刻再写入新文件 - 某些 IDE(如 PHPStorm)开启“safe write”时,先写临时文件再原子替换,Twig 的
filemtime()检测不到变更
真正关闭 Twig 模板缓存的唯一可靠配置
在 config/packages/twig.yaml(或 Symfony 3 的 app/config/config_dev.yml)中,必须显式设置:
twig: cache: false
-
cache: false是 YAML 字面量 false,不是字符串"false",也不是~或null - 设成
cache: ~或留空,Symfony 会 fallback 到默认路径(如%kernel.cache_dir%/twig),等于没关 - 若项目用了多个 Twig 实例(如 email 渲染单独配了一个
email_twig),每个都要单独加cache: false
验证缓存是否真关掉了
别只看页面有没有变,要确认缓存机制停摆:
- 删掉
var/cache/dev/twig/目录(确保它不存在) - 改一个
.twig文件并保存 - 刷新页面,检查
var/cache/dev/twig/是否 没生成任何新文件 - 如果目录里又冒出
abc123.php这类文件,说明cache: false没生效,回头检查 YAML 格式和配置加载顺序
Windows 下还要留意杀毒软件或权限锁死该目录,导致 file_put_contents(): Permission denied —— 此时即使配置对了,Twig 也会静默退回到内存缓存(ArrayCache),表现像“有时生效有时不”。
协作开发时最容易被忽略的一环
本地关掉了,CI 流水线未必同步。多人项目必须让缓存策略可验证、不可绕过:
- CI 脚本里加一行:
php bin/console debug:container --parameter=twig.options | grep '"cache":.*false' - 同时用
curl -I http://app/_profiler看响应头是否含Last-Modified—— 没这个头,说明auto_reload: true没起作用,或者缓存根本没关 - 不要依赖
cache:clear --env=dev来“解决”问题,那是掩盖配置缺陷
真正麻烦的不是怎么关,而是你改完 base.html.twig 推上 Git,队友拉下来一跑,页面还是旧的——因为他的 var/cache/dev/twig/ 里躺着上周编译的 PHP 文件。











