禁用 twig 模板缓存的正确方式是配置 twig: cache: false,仅影响 twig 编译缓存,不影响 doctrine、路由、opcache 等其他缓存机制;切勿设 kernel.debug=true 或手动清空目录。

如何只禁用 Twig 模板缓存而不影响 Symfony3 的其他缓存机制
可以,而且必须通过配置分离控制——Twig 缓存和 Symfony 的 HTTP/Doctrine/PHP-OPcache 等缓存是正交的,互不依赖。关键在于避免误设 kernel.debug = true 全局关缓存,那会连 Doctrine 查询缓存、路由缓存都失效。
twig 配置块中关闭模板缓存的正确写法
在 app/config/config_dev.yml(开发环境)或 config_prod.yml(生产环境)里单独调整 Twig 配置:
twig:
cache: false
# 或指定为 null(等效)
# cache: ~
# 注意:不要写成 cache: '' 或 cache: 0 —— 这些会被 YAML 解析为字符串/整数,Twig 会报错
这个设置仅让 Twig 不写入 var/cache/*/twig/ 目录,也不从该目录加载已编译模板;cache: false 是官方唯一推荐的禁用方式。
为什么不能靠删 var/cache/*/twig/ 目录来“临时禁用”
手动清空 Twig 缓存目录看似有效,但实际有三个坑:
- Symfony 启动时若发现
twig.cache为true(默认),仍会重建该目录并写入新缓存 - 模板修改后,即使目录为空,Twig 仍可能从内存缓存(如 APCu)读取旧版本,尤其在 CLI 命令或长生命周期进程里
- 某些部署流程(如 Capistrano)会自动同步缓存目录,导致你本地删了,上线又恢复
生产环境慎用 cache: false 的真实代价
这不是“能不能”的问题,而是“值不值得”的权衡:
- 每个模板渲染都会触发完整解析 + 编译(相当于每次执行
php -r "echo (new \Twig\Environment(new \Twig\Loader\ArrayLoader()))->compileSource(...);") - 对高并发页面(如首页、API 模板),CPU 使用率可能翻倍,响应时间波动明显
- 若同时启用了 OPcache,PHP 字节码缓存仍生效,但 Twig 层的 AST 缓存丢失,性能损失集中在模板引擎内部
真正需要动态模板(如 CMS 可视化编辑器实时预览)时才考虑它;日常开发调试建议用 cache: '%kernel.cache_dir%/twig' + php bin/console cache:clear --env=dev 组合更可控。











