Laravel路由缓存疑问:修改路由文件无需清缓存的原因排查
这事儿我在帮别人调试Laravel项目时碰到过好几次,咱们一步步拆解可能的原因和排查方法:
先确认项目是否真的启用了路由缓存
Laravel的路由缓存不是默认开启的,只有手动执行过php artisan route:cache命令后,框架才会使用缓存的路由文件。如果对方项目从来没跑过这个命令,那修改routes/web.php或api.php后,框架会自动重新解析路由,根本不需要清缓存。你可以在项目根目录执行这条命令验证:php artisan route:list如果输出开头有
Routes cached!的提示,说明路由缓存处于启用状态;如果没有,那就是没开缓存,自然不用手动清理。检查环境配置(APP_ENV)
Laravel在local开发环境下,默认会自动跳过路由缓存(哪怕你之前手动执行过route:cache),目的是方便开发调试,修改路由后直接生效。你可以打开项目根目录的.env文件,查看APP_ENV的值:APP_ENV=local如果是
local环境,这就是最可能的原因。而你自己的项目可能设置的是production或staging,这类环境下路由缓存会持续生效,修改路由后必须手动清缓存。查看自动加载与composer配置
虽然比较少见,但如果项目的composer.json里的autoload或autoload-dev配置中,把routes目录加入了classmap,可能会导致路由文件被预加载。不过Laravel默认不会这么做,你可以执行这条命令刷新自动加载,看看是否影响路由生效:composer dump-autoload检查RouteServiceProvider的自定义逻辑
有些项目会在app/Providers/RouteServiceProvider.php里修改路由加载逻辑,比如添加了自动清除缓存的代码(比如在local环境下每次请求都自动清路由缓存)。打开这个文件看看map方法或相关逻辑,有没有类似这样的代码:if (app()->environment('local')) { \Artisan::call('route:clear'); }如果有这种自定义处理,那修改路由后自然会自动生效,不用手动操作。
确认缓存驱动配置
这个情况比较罕见,但如果项目的缓存驱动设置为array(.env里CACHE_DRIVER=array),路由缓存会存在内存中,每次请求结束就会失效,修改路由后下一次请求就会重新加载。而你的项目可能用的是file、redis等持久化缓存驱动,缓存会一直保留,必须手动清除。
总结一下,最常见的原因就是项目处于local开发环境,或者从来没启用过路由缓存。按照上面的步骤一步步排查,很快就能找到问题所在。
内容的提问来源于stack exchange,提问作者Abdullah Muhammed

