Twig缓存无法关闭的根本原因是debug=true时强制跳过编译缓存,必须确保APP_ENV=prod且APP_DEBUG=false;真正有效的方式是在twig.yaml中设framework.twig.cache: false,仅此一行即可从源头禁用编译缓存。

Twig模板缓存关不掉?先确认是不是真在prod环境
关Twig缓存不是加一行配置就能生效的事——debug=true时,Twig会强制跳过所有编译缓存,哪怕你写了cache: false也白搭。必须确保APP_ENV=prod且APP_DEBUG=false已生效,否则所有“关闭缓存”的尝试都只是幻觉。
验证方式:运行php bin/console debug:container --env=prod | grep twig,看输出里twig.cache_dir是否为空或指向/dev/null;再检查var/cache/prod/twig/下有没有生成文件,有就说明缓存还在跑。
真正有效的极简关闭方式:只改一个参数
Symfony 3 的 TwigBundle 默认通过framework.twig.cache控制缓存路径,设为false即可禁用编译缓存,连目录都不创建。这不是“清空”,而是从源头切断编译行为。
在config/packages/twig.yaml里写这一行就够了:
framework:
twig:
cache: false
注意:cache: null或cache: ''无效,只有false被Twig原生识别为“不缓存”。其他值(包括0、'0')都会被当成路径字符串处理,反而可能报is_writable() failed错。
dev环境下关Twig缓存?别白费劲
开发时设cache: false没意义——因为debug: true本身就会让Twig每次重新编译模板,缓存压根不启用。你看到的“没缓存”,是debug机制干的,不是配置生效了。
想验证关闭效果,必须切到prod环境:
- 临时改
.env:把APP_ENV=dev改成APP_ENV=prod,并确认APP_DEBUG=false - 清掉旧缓存:
php bin/console cache:clear --env=prod - 别执行
cache:warmup——warmup会主动编译Twig,绕过你的cache: false
然后直接发请求,观察var/cache/prod/twig/是否始终为空目录。
关了缓存之后性能暴跌?这是预期行为
Twig关缓存后,每个请求都要重新解析、编译、加载.twig文件,CPU和IO压力明显上升。这不是配置错了,而是关缓存的必然代价。
只在两种场景适合关:
- CI/CD流水线里做模板语法校验(不需要渲染性能)
- 极小规模CLI命令,且模板极少变动
线上服务千万别关。如果发现模板更新后页面没变,优先查文件权限、OPcache、反向代理缓存,而不是动Twig缓存开关。


















