视图缓存仅加速 blade 模板编译,需手动运行 php artisan view:cache 生成 storage/framework/views/ 下的 php 文件,内容变更后哈希更新,开发环境需手动刷新,生产环境须在部署流程中严格校验路径与指令注册。

视图缓存不是开个开关就生效的,它只对 Blade 编译后的 PHP 文件起作用,原始 .blade.php 文件改动后必须重新生成缓存,否则看不到更新。
view:cache 命令到底干了什么
它把所有 .blade.php 模板编译成纯 PHP 文件,存进 storage/framework/views/ 目录。下次请求时,Laravel 直接 require 这些 PHP 文件,跳过词法解析和编译过程。
- 仅影响 Blade 模板(
.blade.php),普通.php视图不参与 - 不会压缩 HTML、不合并资源、不处理 @include 的嵌套逻辑判断
- 缓存文件名基于模板路径 + 内容哈希,内容一变,哈希就变,下次运行
view:cache会覆盖旧文件 - 开发环境别常驻开启——改完模板得手动跑一遍命令才能看到效果
生产环境部署时怎么安全启用
关键不是“怎么开”,而是“什么时候开、开完怎么验”。CI/CD 流程里漏掉这步,上线后可能还在用旧视图。
- 必须在
composer install --no-dev之后、服务重启之前执行php artisan view:cache - 检查
storage/framework/views/下是否生成了大量.php文件(而非空目录或只有 .gitignore) - 访问一个带
@if或@foreach的页面,用dd(app('view.engine.resolver')->resolve('blade')->getCompiler()->getCompiledPath('welcome'))查看实际加载路径,确认是storage/...下的 PHP 文件 - 如果用了自定义 Blade 指令(
Blade::directive),确保它们已在AppServiceProvider::boot()中注册——缓存阶段不执行服务提供者,指令未注册会导致编译报错Undefined directive 'mydirective'
为什么有时候开了也没提速
视图缓存只省掉编译时间,不解决数据查询、N+1、布局嵌套层级深等真瓶颈。
- 单次渲染耗时
- 启用了
APP_DEBUG=true时,Laravel 强制跳过视图缓存(哪怕文件存在),只走实时编译 - 使用
View::share()或模板中直接调用config()、env()等动态函数,不会被缓存“固化”,每次仍要执行 - 若
storage/目录权限不对(如 www-data 无法读取生成的 PHP 文件),会静默 fallback 到编译模式,日志里也不报错
真正要注意的是:缓存文件本身没有自动失效机制。修改模板后忘了跑 view:cache,或者部署时覆盖了 storage/framework/views/ 却没重建,就会卡在旧逻辑里——这种问题线上很难排查,因为 HTTP 响应完全正常,只是内容不对。










