Laravel路由缓存仅生效于routes/web.php和routes/api.php中顶层静态声明的Route::get等路由,不缓存闭包路由、fallback、动态注册及条件包裹的路由,需确保环境为production、APP_KEY已设置、权限正确且部署顺序无误。

路由缓存只对 Route::get 等顶层定义生效
Laravel 的 php artisan route:cache 不会缓存闭包路由、控制器方法里动态注册的路由,也不会处理 Route::middleware() 里嵌套的路由组——它只扫描 routes/web.php 和 routes/api.php 中由框架顶层调用的 Route::get、Route::post 等静态声明。
常见错误现象:Route::group(['prefix' => 'admin'], function () { ... }) 里的路由能被缓存,但如果你在中间件里用 app('router')->get(...) 动态加路由,缓存后直接失效,请求 404。
- 确保所有路由都在
routes/*.php文件中,且没被条件判断包裹(比如if (app()->environment('local')) { Route::get(...) }) - 不要在服务提供者或中间件里调用
Route::get—— 缓存时这些代码根本没执行 - 使用
php artisan route:list对比缓存前后输出,确认关键路由是否还在列表里
route:cache 会忽略 Route::fallback 和闭包路由
闭包路由(Route::get('/', function () { ... }))和 Route::fallback() 在缓存过程中会被直接跳过,不是报错,而是静默丢弃。上线后访问对应路径,返回 404 是最典型的信号。
使用场景:本地开发常写闭包做快速验证,但上线前必须转成控制器方法;fallback 路由常用于兜底页或 SPA 前端路由,缓存后它就没了。
- 把闭包路由全部迁移到控制器,哪怕只是临时建个
PagesController@home -
Route::fallback()必须放在routes/web.php最末尾,且不能依赖运行时变量(如request()->user()) - 缓存后务必测试 404 页面是否还能触发——如果不能,说明
fallback没进缓存
缓存文件权限和部署时机容易出问题
route:cache 生成的 bootstrap/cache/routes-v7.php(版本号随 Laravel 升级变化)是 PHP 可执行文件,需要 web server 进程有读取权限;更关键的是,它必须在「所有代码已同步完成」之后再生成,否则缓存内容和当前代码不一致,轻则路由错乱,重则 Class not found。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
性能影响:缓存后每次请求省去路由解析开销,对高并发 API 接口提升明显;但开发期反复改路由时,route:clear + route:cache 会拖慢部署节奏。
- CI/CD 中,
php artisan route:cache必须放在git pull或rsync完成之后,且应在composer install --no-dev之后 - 确保
bootstrap/cache/目录对 web server 用户(如www-data或nginx)可读,但不可写(防意外覆盖) - 上线后第一次访问若报
ParseError或空白页,大概率是缓存文件写入一半被中断,删掉bootstrap/cache/routes-*.php手动清一次再重试
环境配置不匹配会导致缓存失败但无提示
APP_ENV=local 时,Laravel 默认禁用路由缓存(即使你手动执行了 route:cache),而 APP_ENV=production 下又要求 APP_KEY 已设置。这两条任一不满足,命令会静默成功,但生成的缓存文件为空或无效。
兼容性影响:Laravel 9+ 对 PHP 8.0+ 有严格要求,如果缓存时用的是 PHP 8.1,但线上跑的是 8.0,可能因语法差异导致 routes-v7.php 解析失败。
- 部署前检查
APP_ENV是否为production,且APP_KEY不为空(php artisan key:generate未执行会导致缓存空文件) - 在部署脚本里加一句
php -v | head -n1和php artisan --version核对环境一致性 - 缓存后立即执行
php -l bootstrap/cache/routes-*.php验证语法有效性,比等用户报错更快
缓存不是开关一按就完事,它把路由逻辑从“运行时解析”变成“编译后加载”,任何破坏这个前提的动作——不管是动态注册、环境错配,还是权限失控——都会让整个机制在无声中失效。










