Twig模板在Symfony3中默认开启缓存,即使dev环境下也会缓存编译后的PHP文件于var/cache/,导致修改index.html.twig后页面不刷新;需显式配置cache: false并清缓存验证。

Twig 模板在 Symfony3 中默认开启缓存,即使你改了 index.html.twig 文件,页面也不刷新——这不是浏览器缓存,是 Twig 自己把编译后的 PHP 文件缓存在 var/cache/ 下,而且开发环境(dev)下也默认启用缓存(只是会自动检测文件变更并重建,但有时会失效或延迟)。
确认当前环境是否真为 dev
Symfony3 的缓存行为严格依赖 APP_ENV(或旧式 SYMFONY_ENV)环境变量。如果你用的是 php bin/console server:run,它默认走 dev 环境;但如果你通过 Nginx/Apache 直接访问,可能意外落到 prod 环境,而 prod 下 Twig 缓存完全不检查模板文件修改。
- 检查请求入口:确认你访问的是
http://localhost:8000(dev server),而不是http://localhost/app_dev.php或直接根目录(容易被路由到 prod) - 看响应头或页面底部:dev 环境页面通常带「Symfony Profiler」小图标,prod 没有
- 运行
php bin/console about,看输出里Environment一行是不是dev
强制关闭 Twig 缓存(仅限开发)
在 config/packages/twig.yaml(Symfony3.4+)或 app/config/config_dev.yml(旧结构)中,显式禁用缓存:
twig:
cache: false
注意:cache: false 是开关,不是路径;设成 null 或字符串路径(如 %kernel.cache_dir%/twig)仍会启用缓存。如果用了旧版配置(config.yml),确保这段写在 imports 之后、且被 dev 环境加载。
- 改完必须清缓存:
php bin/console cache:clear --env=dev(或--no-warmup避免预编译) - 若用内置服务器,重启
php bin/console server:run才生效(因为服务进程已加载配置) - 不要在
prod环境设cache: false,性能会断崖式下跌
常见干扰项:模板路径没生效 or asset URL 不更新
你以为改了模板,其实渲染的是另一个同名文件。Twig 按 bundle → 子目录 → 文件名三级查找,::base.html.twig 和 App::base.html.twig 可能指向不同位置。
- 用
php bin/console debug:twig查看 Twig 加载器实际搜到的模板路径 - 检查是否有多个
base.html.twig:比如templates/(新推荐)和app/Resources/views/(旧)同时存在,优先级不同 -
{{ asset('css/app.css') }}返回的 URL 不变?那是 asset 版本号缓存,清缓存或加?v=123临时绕过,根源在assets:install或 Webpack Encore 配置
最常被忽略的一点:你改的是 templates/ 下的文件,但控制器里 render 的是 @App/xxx.html.twig,而这个路径默认不查 templates/,除非你显式配置了 twig.default_path 或用 App::xxx.html.twig 这种语法。路径歧义比缓存本身更难排查。

















