必须在config/packages/twig.yaml中显式设twig: cache: false并清缓存,app_dev.php中修改无效;dev环境下Twig默认内存缓存,不落盘但依然生效,prod环境需确保cache指向可写文件路径。

app_dev.php 里关模板缓存根本没用
直接在 app_dev.php 文件里改 Twig 配置,比如设 cache => false 或指向 /dev/null,不会生效。因为 Symfony 3 的模板缓存开关由环境配置驱动,不是靠入口文件控制的。入口文件只负责加载环境、启动 Kernel,真正决定是否启用 Twig 缓存的是 config/packages/twig.yaml(或旧版 config.yml)中 twig: cache 的值,且该值会被 APP_ENV 和 debug 覆盖。
dev 环境下 Twig 缓存默认是关的,但别信“不生成文件”就等于没缓存
Symfony 3 在 APP_ENV=dev 且 debug=true 时,默认把 Twig 模板编译缓存到内存(ArrayAdapter),所以你翻 var/cache/dev/twig/ 看不到 PHP 文件——这不代表没缓存,只是它不落盘。这种内存缓存仍会复用已编译的模板字节码,加速渲染,但每次修改模板都会自动刷新,开发体验不受影响。
- 想强制禁用所有 Twig 缓存(包括内存级),必须显式设
cache: false,不能依赖环境自动推断 - 若用的是 YAML 配置,在
config/packages/twig.yaml中写:twig: cache: false - 若用 XML 或旧版
config.yml,对应字段是twig: { cache: false } - 改完要清缓存:
php bin/console cache:clear --env=dev,否则旧缓存还在容器里
为什么你在 app_dev.php 里加 ini_set('opcache.enable', 0) 也没用
Twig 缓存和 OPcache 是两层东西。前者是 Symfony 把 Twig 模板编译成 PHP 类并缓存;后者是 PHP 引擎对已加载 PHP 文件做的字节码缓存。关 OPcache 不影响 Twig 缓存行为,反而可能让模板每次都要重新解析,拖慢 dev 环境响应。真正要干预 Twig 缓存,只动配置,不动入口文件或 PHP 设置。
-
app_dev.php唯一该做的事:确保debug为true,并加载正确的环境配置 - 不要在
app_dev.php里调$kernel->getContainer()->get('twig')->disableCache()这类运行时操作——容器还没完全构建,会报错或静默失败 - 如果非要动态控制(比如某些调试场景),应在 Twig 扩展或事件监听器里做,而不是入口文件
生产环境千万别沿用 dev 的 Twig 缓存设置
一旦切到 APP_ENV=prod,Symfony 默认开启 Twig 文件缓存,路径在 var/cache/prod/twig/。这时如果之前为了 debug 在 app_dev.php 里硬编码关了缓存,又没同步改 prod 配置,上线后模板每次请求都重新编译,CPU 直接拉满。
立即学习“PHP免费学习笔记(深入)”;
- 检查 prod 配置是否明确启用缓存:
twig: { cache: '%kernel.cache_dir%/twig' } - 确认
var/cache/prod/twig/可写,且目录存在(cache:warmup --env=prod会创建它) - 用
php bin/console debug:config twig --env=prod看最终生效的cache值,避免被 bundle 或条件配置覆盖
缓存开关藏在环境配置层级里,不在入口文件上。改错地方,轻则无效,重则毁生产。



















