开 debug 不等于关 Twig 缓存,必须显式设 cache: false 才能让 .twig 文件改完即生效;因为 debug 控制异常页面和 Profiler 等,而 Twig 在 dev 环境默认仍启用编译缓存以提升响应速度。

开 debug 不等于关 Twig 缓存,必须显式设 cache: false 才能让 .twig 文件改完即生效。
为什么 debug=true 不能关掉 Twig 模板缓存
Twig 的缓存开关和 Symfony 的 debug 模式是两套独立机制。debug 控制的是异常页面、Profiler、容器热加载等,而 Twig 默认在 dev 环境下仍启用编译缓存(把 .twig 编译成 PHP 文件存到 var/cache/dev/twig/),目的是提升响应速度。你改了模板却没刷新,不是浏览器问题,是 Twig 根本没重新解析文件。
常见错误现象:
- 保存 .twig 后刷新页面,内容不变
-
var/cache/dev/twig/下持续生成新 PHP 文件(如abc123.php) - 执行
php bin/console cache:clear后暂时生效,但下次保存又失效
真正关闭 Twig 缓存的唯一可靠写法
在 config/packages/twig.yaml 中强制指定 cache 值为 false,不要留空、不要注释、不要写 null 或 ~ —— 这些都会被 Symfony 合并回默认路径。
正确配置示例:
twig: cache: false # 其他配置如 paths、globals 等保持不变
关键点:
- 该配置对所有使用默认 Twig 实例的模板生效
- 若项目中定义了多个 Twig 实例(如
email_twig),每个都要单独加cache: false - 设成
false后,Twig 不再写入var/cache/dev/twig/,也不读取任何编译缓存,每次请求都从头解析 .twig 文件
验证是否真的关成功了
别只看页面效果,要检查缓存目录行为:
- 手动删掉
var/cache/dev/twig/整个目录 - 改一个已加载的 .twig 文件并保存
- 刷新对应页面
- 观察
var/cache/dev/twig/是否有新文件生成 —— 如果没有,说明cache: false已生效
容易被忽略的干扰项:
- PHPStorm 的 “safe write” 功能:默认先写临时文件再原子替换,Twig 监听不到变更 → 关闭 Settings > System Settings > Use "safe write"
- Docker 环境:确保
var/cache是可写 volume,且宿主机与容器时区一致,否则filemtime()判断可能出错,导致缓存误判未更新 - Windows 权限或杀毒软件锁定
var/cache/dev/twig/,报file_put_contents(): Permission denied
想折中?用内存缓存代替磁盘缓存
如果完全关掉缓存导致开发机响应明显变慢(比如大量 include / extends),可以换用内存适配器,避免磁盘 I/O,又不失“变更感知”能力:
twig: cache: 'cache.adapter.php_array'
这个适配器不落盘,只存在 PHP 进程内存里,每次请求都重来,但省去了文件系统操作。适合模板结构稳定、主要调样式或小逻辑的阶段。
注意:cache.adapter.php_array 不支持跨请求共享,所以它不会造成“改了不生效”的假象,也无需担心清理问题 —— 它天然就是每次请求干净起步。











