route:clear 命令仅删除 bootstrap/cache/routes.php 文件,不清理其他缓存,也不重载路由;执行后下次请求才会重新解析路由文件,前提是该文件存在且可写。

route:clear 命令到底清什么
它只删 bootstrap/cache/routes.php 这个文件,不碰其他缓存,也不 reload 路由定义。也就是说:改了 routes/web.php 后执行它,下一次请求就能走新路由;但如果你之前用过 php artisan route:cache,那这个命令就是必须的——否则 Laravel 会继续从缓存文件里读旧路由。
- 不是所有环境都需要它:开发时关掉路由缓存(
APP_DEBUG=true且没手动跑过route:cache),就根本没这个文件 - 它不会报错,哪怕
routes.php本来就不在缓存里——静默成功是常态 - 执行后别急着测,先确认 Web 服务器(如 Nginx)没把 301/302 重定向或浏览器缓存了旧路径
为什么有时候 route:clear 不生效
常见假象是“清了但路由还是旧的”,其实问题往往不在命令本身,而在缓存叠加或部署残留:
-
route:clear只清路由缓存,如果同时开了配置缓存(config.php),而你改了中间件、命名空间或控制器路径,得顺手补一句php artisan config:clear - 改了路由但控制器方法名写错了,Laravel 报
Class not found或Method does not exist,容易误判成“缓存没清干净” - 使用 Forge / Envoyer / Laravel Vapor 等部署工具时,缓存可能被写在共享目录或容器卷里,本地
route:clear对线上无效 - 某些 CI/CD 流程会在构建阶段自动执行
route:cache,上线后你清的是本地缓存,而服务器跑的是构建时生成的缓存文件
route:cache 和 route:clear 的配合逻辑
route:cache 是生产优化手段,把所有路由编译成静态数组;route:clear 是它的反向操作——但二者不是“开关”关系,而是“生成 vs 删除”关系:
-
route:cache要求所有路由必须指向控制器方法,不能有闭包路由(function () { ... }),否则直接失败 - 执行
route:cache后,routes/*.php文件就不再被读取,哪怕你删掉整个routes目录,应用照样跑(只要routes.php缓存还在) -
route:clear不会重建路由,它只是让 Laravel 下次请求时重新解析 PHP 文件——所以确保你的路由文件语法正确,否则 500 就来了 - CI/CD 中推荐流程:
route:clear→ 修改代码 →route:cache,而不是“清完就上线”,避免中间态出错
线上环境清理路由缓存的注意事项
生产环境不能只靠 php artisan route:clear 一招鲜,得看部署方式和缓存落盘位置:
- 如果用 Supervisor 管理队列或 Horizon,要确认它没缓存旧的 autoload 或路由映射——有时
php artisan queue:restart才是关键 - 多台 Web 服务器时,
route:clear必须在每台机器上单独执行,或通过部署脚本广播 - 使用 Redis 作缓存驱动时,
route:clear不影响 Redis,它只操作本地文件;但如果你把视图或配置也存在 Redis,得额外清理cache:clear --driver=redis - 最隐蔽的坑:某些 PaaS 平台(如 Laravel Forge 的“快速部署”)会跳过
artisan命令,直接用 rsync 同步代码,此时必须在“部署后命令”里显式加php artisan route:clear
真正麻烦的从来不是命令敲不对,而是你以为清了缓存,其实清的是 A 地方,而代码跑在 B 地方——查 bootstrap/cache 目录是否存在、是否可写、是否被 Git 忽略,比反复执行命令有用得多。



















