启用路由缓存需确保路由全在控制器中定义且项目处于生产环境,执行php artisan route:cache后生成bootstrap/cache/routes.php文件,后续请求直接加载该缓存;闭包路由会导致缓存失败,需移至控制器;route:clear仅删除缓存文件,不重启服务;开发环境不应启用,避免修改路由后未更新缓存导致404。

直接执行 php artisan route:cache 就能启用
只要你的路由全部定义在控制器里(没用闭包),且项目处于生产环境,运行这条命令就完成了。它会把 routes/web.php、routes/api.php 和所有通过 RouteServiceProvider 加载的路由,一次性解析、编译成一个高度优化的 PHP 数组,写入 bootstrap/cache/routes.php。后续每次请求,Laravel 都跳过原始文件解析,直接加载这个缓存文件。
- 执行后你会看到
Routes cached successfully!,说明已生效 - 开发阶段不建议常开——改了路由必须手动重跑,否则修改完全不生效
- CI/CD 部署脚本里加一行
php artisan route:cache是最稳妥的做法
为什么有些路由“缓存后就失效”?闭包路由不能缓存
如果你在 routes/web.php 里写了类似 Route::get('/test', function () { return 'ok'; }); 这种闭包定义,route:cache 命令会直接报错退出,或者静默跳过该路由(取决于 Laravel 版本)。因为 PHP 的匿名函数无法被序列化,也就没法写进缓存文件。
- 检查方式:运行
php artisan route:list,看有没有路由显示为Closure类型 - 修复方法:把所有闭包路由移到控制器中,哪怕只是临时建个
TestController - 注意:Laravel 10+ 对闭包支持更严格,部分版本甚至会中断整个缓存过程
route:clear 不是“重启服务”,只是删掉缓存文件
缓存不是常驻内存的服务,它就是一个静态 PHP 文件:bootstrap/cache/routes.php。执行 php artisan route:clear 实际上只做一件事:删除这个文件。下一次请求时,Laravel 自动回退到动态加载模式。
- 不需要 reload PHP-FPM、不用重启 Nginx/Apache
- 但如果你同时用了配置缓存(
config:cache),要单独清它:php artisan config:clear - 部署时如果忘记清缓存又误改了路由,可能线上访问 404 却查不到原因——这是最常被忽略的排查点
别在本地开发环境默认开启路由缓存
开发时频繁增删改路由是常态,而缓存机制要求你每次改动后都手动运行 route:cache。这不仅打断节奏,还容易漏掉——比如改完路由忘了重缓存,结果花十分钟调试“为什么新路由不生效”,最后发现是缓存没更新。
- 推荐做法:只在
APP_ENV=production时启用,本地保持APP_ENV=local - 可以加个 Git hook 或部署脚本自动处理:
composer install --no-dev && php artisan config:cache && php artisan route:cache - 真正容易出问题的,不是“怎么开”,而是“什么时候不该开”和“开了之后忘了关”











