必须写 cache: false 才能彻底关闭 Twig 缓存,注释或设为 null/~ 仍启用默认磁盘缓存;需在每个 Twig 实例配置中明确设置,并删除 var/cache/dev/twig/ 验证是否停写。

twig.yaml 里必须写 cache: false,不是注释掉或留空
很多人以为把 cache 配置行注释掉,或者设成 ~、null 就等于关闭缓存——其实 Symfony 会把它合并为默认路径 %kernel.cache_dir%/twig,缓存照常工作。只有明确写 cache: false(YAML 布尔字面量,不是字符串)才能让 Twig 引擎彻底跳过缓存写入逻辑。
实操建议:
- 打开
config/packages/twig.yaml,找到twig:下的cache:行 - 删掉原有值(比如
"%kernel.cache_dir%/twig"或注释),改成cache: false - 如果用了多个 Twig 实例(如
email_twig),每个实例的配置块都要单独加这一行 - 改完后不用清缓存,但要删掉
var/cache/dev/twig/目录验证是否停写
别信 APP_DEBUG=true 就自动关缓存
APP_DEBUG=true 只影响错误页面、Profiler、容器热加载等,和 Twig 缓存开关完全无关。Symfony 3 的 Twig 默认在 dev 环境下仍启用磁盘缓存,目的是提速——结果就是你改了 base.html.twig,刷新页面却没变化。
常见错误现象:
- 改完模板保存,页面没更新,
var/cache/dev/twig/却持续生成新 PHP 文件 - 用
php bin/console debug:container --parameter=twig.options查出cache值是字符串路径,不是false - 本地有效,CI 流水线里失效 → 很可能 CI 运行时没加载
config_dev.yml,或环境变量被覆盖
验证是否真关掉了:看 var/cache/dev/twig/ 还写不写文件
最直接的验证方式不是看页面变没变,而是盯住缓存目录。关成功后,这个目录应始终为空(或根本不存在),且任何模板修改都不会触发新文件生成。
操作步骤:
- 手动删除
var/cache/dev/twig/整个目录 - 访问一个用了该模板的路由(比如
/) - 立刻检查目录是否存在、是否有新 PHP 文件
- 再改一次
.twig文件并保存,重复访问 → 若目录仍空,说明cache: false生效
注意:某些 IDE(如 PHPStorm)默认开启 “safe write”,会先写临时文件再原子替换,导致 Twig 的 filemtime() 检查失效。此时需在 IDE 设置中关闭该选项。
Docker 或 Windows 下容易卡在权限和时区
即使配置正确,cache: false 也可能因底层限制表现异常:Docker 容器里 var/cache 目录不可写,Windows 下杀毒软件锁住 twig/ 子目录,或宿主机与容器时区不一致导致 filemtime() 返回时间戳错乱——这些都会让 Twig 误判文件未更新,进而退回到内存缓存(ArrayCache)行为。
排查要点:
- 进容器执行
ls -l var/cache,确认dev/和其子目录可写 - Windows 下检查杀毒软件是否拦截
file_put_contents()对var/cache/dev/twig/的调用 - Docker Compose 中确保挂载卷权限正确,例如用
user: "1001:1001"匹配容器内 UID/GID - 同步宿主与容器时区:在
docker-compose.yml加environment: - TZ=Asia/Shanghai
真正麻烦的不是配置写错,而是缓存静默生效——你改了模板,队友的机器从旧编译文件里读,谁也看不出问题,直到上线才暴露。


















