真正关闭twig模板缓存需在twig.yaml中设cache: false,而非清空var/cache目录;debug=false时缓存默认强制启用,清空仅触发重建,生产环境禁用会导致qps骤降40%。

模板缓存不是靠清空目录关闭的
清空 var/cache 目录只会临时让 Symfony 重新生成缓存文件,下次请求仍会写入——它不等于禁用模板缓存。真正控制 Twig 模板是否编译缓存的是 debug 配置项,而非目录状态。
-
debug=true(如 dev 环境):Twig 自动跳过模板缓存,每次加载都重新解析 .twig 文件 -
debug=false(如 prod 环境):Twig 强制启用模板缓存,缓存文件写入var/cache/{env}/twig/,清空目录后首次请求会重建 - 手动删掉
var/cache/prod/twig/下所有文件,再访问页面,你会看到该目录立刻被填满——这不是 bug,是预期行为
想彻底关掉 Twig 模板缓存,得改配置
唯一可靠方式是在 Twig 配置中显式禁用缓存,即使 debug=false 也生效。注意:这仅影响 Twig 层,不影响服务容器、路由或 HTTP 缓存。
- 在
config/packages/twig.yaml中设置:twig: cache: false
- 若使用 PHP 配置(
config/packages/twig.php),写:->cache(false)
- 该配置会让 Twig 始终调用
Twig\Loader\FilesystemLoader直接读取源文件,跳过Twig\Cache\FilesystemCache - 副作用明显:每次渲染都需解析 AST、生成 PHP 代码,开发时可接受,生产环境严禁启用
为什么有人误以为“清空目录=关闭缓存”
因为 dev 环境默认 debug=true,模板缓存本就不生效,此时清空 var/cache 看不出区别;而 prod 环境下清空目录后首次请求变慢,容易让人误判为“缓存被关了”,实际只是缓存重建延迟。
- 验证是否真关了:检查
var/cache/prod/twig/是否有新文件生成(有 = 缓存开着) - 检查 Twig 实例的
getCache()返回值:返回null表示cache: false生效;返回FilesystemCache实例说明仍在用缓存 - 别依赖
cache:clear命令来“停缓存”——它只清旧数据,不改行为
生产环境千万别关模板缓存
关掉 Twig 模板缓存在 prod 下会导致每个请求多出 10–50ms 解析开销,且 CPU 使用率陡增。这不是微优化问题,而是性能断崖。
- 典型症状:ApacheBench 测试中 QPS 突降 40%,
top显示 PHP 进程 CPU 占用持续 90%+ - 正确做法:保持
cache: true(默认),用APP_ENV=prod APP_DEBUG=false确保缓存路径和编译逻辑全启用 - 调试模板?用
APP_ENV=dev,而不是在 prod 里关缓存——这是环境职责分离的基本约束











