Laravel 5.8执行任意Artisan命令时调度器同步触发问题咨询
解决Laravel 5.8执行任意Artisan命令触发调度器的问题
我之前也碰到过Laravel 5.8这个头疼的问题——确实和7.x版本不一样,每次执行任何Artisan命令时,调度器都会被莫名触发,而Laravel 7+已经修复了这个默认行为。
问题原因
在Laravel 5.8的Illuminate\Foundation\Console\Kernel类中,handle方法默认会直接调用$this->schedule()->run(),也就是说,所有Artisan命令都会触发调度器的运行逻辑。而Laravel 7及以后的版本,这个逻辑被调整为仅当执行schedule:run命令时才触发调度器。
修复步骤
你只需要修改项目根目录下的app/Console/Kernel.php文件,调整handle方法的逻辑,让它只在执行schedule:run命令时才运行调度:
- 打开
app/Console/Kernel.php - 找到
handle方法,替换成以下代码:
public function handle(SymfonyStyle $style) { // 仅当当前命令是schedule:run时,才触发调度器 if ($this->input->getFirstArgument() === 'schedule:run') { $this->schedule()->run(); } return parent::handle($style); }
或者也可以通过判断命令实例的方式(更严谨):
public function handle(SymfonyStyle $style) { if ($this->command instanceof \Illuminate\Console\Scheduling\ScheduleRunCommand) { $this->schedule()->run(); } return parent::handle($style); }
修改完成后,再执行任意Artisan命令(比如php artisan list),调度器就不会再被触发了。
内容的提问来源于stack exchange,提问作者Илья Вайнер
相关产品推荐
相关产品推荐

