必须显式设置cache: false才能真正关闭Twig模板缓存,仅APP_DEBUG=true无效;关闭后每次请求重新解析.twig文件,改保存即生效,需验证var/cache/dev/twig/是否停写。

改了 .twig 文件但页面没变,不是文件没保存,而是 Twig 缓存没真正关掉——debug=true 不等于模板不缓存,必须显式设 cache: false。
为什么 APP_DEBUG=true 还要手动关 cache
Twig 的缓存开关和 Symfony 的 debug 模式是两套独立机制。前者控制是否把 .twig 编译成 PHP 文件并复用,后者只影响错误提示、Profiler 和容器热加载。即使 APP_ENV=dev 且 APP_DEBUG=true,Twig 默认仍会写缓存到 var/cache/dev/twig/,你改完保存,它根本不去重新解析。
-
cache: false是唯一能强制跳过编译缓存的配置,设成null、~或留空都会 fallback 到默认路径 - 若用了多个 Twig 环境(比如单独配了
email_twig),每个都要单独加cache: false - Windows 下注意杀毒软件或 IDE(如 PHPStorm)的“safe write”可能让文件变更不被监听,需在 IDE 设置里关掉
怎么确认 cache: false 生效了
别只看页面有没有变,要验证缓存目录是否真的停写:
- 删掉
var/cache/dev/twig/目录 - 改一个模板,保存
- 刷新页面,再检查
var/cache/dev/twig/是否有新生成的 PHP 文件(如abc123.php) - 没有新文件 → 关成功;有新文件 → 配置未生效或被覆盖
常见干扰项:auto_reload: true 必须同时启用(默认是开启的),否则即使 cache: false,Twig 也不会检测文件修改时间。
config/packages/twig.yaml 中必须这么写
不是注释掉,不是设为空字符串,也不是用变量引用路径:
twig: cache: false # 其他配置保持不变,例如: # default_path: '%kernel.project_dir%/templates' # strict_variables: true
- 这个
false是 YAML 字面量,不是字符串"false",否则会被当路径处理 - 如果项目沿用旧式结构(如
app/config/config_dev.yml),则需在对应环境配置里写,优先级更高 - Docker 环境下务必确认
var/cache是可写的卷,且宿主机与容器时区一致,否则filemtime()判断失效,缓存误判为未更新
关掉后性能会怎样
每次请求都会重新读取、词法分析、语法树构建、生成 PHP 代码——启动慢,但改完保存即生效,适合调试逻辑和语法错误。
- 这不是生产配置,仅限开发阶段使用
- 若想折中,可把缓存指向内存适配器(如
cache.adapter.array),避免磁盘 I/O,又不完全失去缓存机制 - 真正麻烦的是:你改了
base.html.twig,队友却还在读var/cache/dev/twig/xxx.php里的旧编译结果——所以cache: false要写死在共享配置里,不能靠口头约定


















