Laravel 6控制器调用Artisan执行config:cache等命令不生效如何解决
问题根因
- Laravel 会在请求生命周期启动阶段就完成配置、路由的加载操作,你在控制器中调用
Artisan::call()生成新缓存后,本次请求依然使用的是启动时加载的旧数据,所以看起来命令未生效,实际上新缓存默认会在下一次新请求中自动加载。 - 第二个常见触发原因是
bootstrap/cache目录权限配置错误,Web服务器进程没有新生成缓存文件的读取权限,或是目录名拼写错误(误写为boostrap)导致缓存生成到错误路径无法被加载。
可行解决方案
方案1:基础适配方案
如果不需要当前请求立即使用新缓存,调用命令后跳转触发新请求即可生效:
// 控制器代码 public function updateCache() { \Artisan::call('config:cache'); \Artisan::call('route:cache'); // 跳转后新请求会自动加载新缓存 return redirect()->back()->with('msg', '缓存更新完成'); }
操作前需先确认bootstrap/cache目录给Web服务器运行用户开放了读写权限,Linux环境下推荐权限为755,所有者设置为Web运行用户(如www-data)。
方案2:当前请求立即生效方案
如果需要在本次请求中就使用新的配置、路由,可手动重载对应的框架实例:
public function refreshCache() { // 生成新缓存文件 \Artisan::call('config:cache'); \Artisan::call('route:cache'); // 重载配置实例 $this->app->instance('config', new \Illuminate\Config\Repository( require bootstrap_path('cache/config.php') )); // 重载路由集合 $this->app['router']->setRoutes( require bootstrap_path('cache/route.php') ); // 后续业务代码即可使用新配置、路由 }
方案3:共享主机权限适配方案
如果是共享主机环境无法调整目录权限,可通过队列异步执行缓存生成逻辑,CLI模式运行的队列进程生成的缓存文件权限通常符合读取要求:
- 创建队列任务类
RefreshCacheJob - 在任务类的
handle方法中执行Artisan::call缓存命令 - 控制器中派发队列任务即可
重要提示:不建议在生产环境对外暴露无权限校验的缓存更新接口,避免恶意用户频繁触发缓存生成导致服务异常。
内容的提问来源于stack exchange,提问作者tayeb320
相关产品推荐
相关产品推荐

