Laravel路由缓存仅适用于生产环境,是部署时的性能补丁而非通用开关;开发阶段必须禁用,否则路由修改不生效,且闭包路由会导致缓存失败,需全部替换为控制器方法。

路由缓存只在生产环境启用
它不是“开了更好”的通用开关,而是专为部署后稳定运行设计的性能补丁。开发阶段必须关——改一行 routes/web.php 就得手动清缓存再重生成,否则修改完全不生效,你会卡在“明明改了却 404”或“旧路由还在响应”的状态里。
典型适用场景包括:
- 上线后的正式服务器(如 Nginx + PHP-FPM 环境)
- CI/CD 部署流程末尾,作为自动步骤执行
- 路由数量 ≥ 200 条(实测提升明显;少于 50 条基本感知不到差异)
闭包路由存在时 route:cache 会直接失败
执行 php artisan route:cache 时如果检测到任何匿名函数定义的路由(比如 Route::get('/', function () { return 'hello'; });),命令会中止并报错:Unable to cache routes. Compiled routes file does not exist. 或更直白的提示“Closures can't be cached”。
必须全部替换为控制器方法:
- 把闭包逻辑移到
app/Http/Controllers/HomeController.php等处 - 路由定义改为
Route::get('/', [HomeController::class, 'index']); - 资源路由(
Route::resource())天然兼容,优先用
缓存后路由文件修改无效,必须重新生成
一旦 bootstrap/cache/routes.php 存在,Laravel 启动时就跳过所有 routes/*.php 文件解析,直接加载该缓存文件。这意味着:
- 你改了
routes/api.php,请求行为不会变 -
php artisan route:list显示的也是缓存里的旧结构 - 只有运行
php artisan route:clear删除文件,再php artisan route:cache才能更新
所以别把它当开发工具,而要当成部署动作的一部分——和 php artisan config:cache 放在同一脚本里执行。
和配置缓存、视图缓存是独立机制,需分别管理
路由缓存不依赖也不影响 config:cache 或 view:cache。三者可共存,但各自有独立的缓存文件和清除命令:
- 路由缓存 →
bootstrap/cache/routes.php→route:cache/route:clear - 配置缓存 →
bootstrap/cache/config.php→config:cache/config:clear - 视图缓存 →
storage/framework/views/下文件 →view:clear
最容易忽略的是:本地开发时如果误跑了 route:cache,又忘了 route:clear,第二天调试新路由就会陷入“为什么我写的路由死活不注册”的循环。建议在 .gitignore 里确认 bootstrap/cache/* 已被忽略,避免意外提交缓存文件。



















