您好我有关于任务schedulling的问题。我有几个控制器,我想使用Laravel任务调度来调用那些控制器。我已经在服务器中添加了一行cronjob。我在kernel.php文件中有这样的代码,基本上可以使用。
protected function schedule(Schedule $schedule) {
$schedule->call('App\Http\Controllers\firstController@index')->everyMinute()->name('firstController_cronjob')->withoutOverlapping();
$schedule->call('App\Http\Controllers\secondController@index')->everyMinute()->name('secondController_cronjob')->withoutOverlapping();
$schedule->call('App\Http\Controllers\thirdController@index')->everyMinute()->name('thirdController_cronjob')->withoutOverlapping();
}
但我有一个问题。此脚本按顺序运行。是否可以将Laravel控制器作为并行计划任务运行?
答案 0 :(得分:0)
Laravel文档中未提及runInBackground()
方法,但their API中列出了该方法。
您可以将其添加到每个$schedule
行:
$schedule->...->runInBackground();
看看它是否有帮助。不过,我不确定它是否适用于withoutOverlapping()
。我在使用PHP 7和IIS的Laravel 5.2上做了很少的测试,并且没有任何任务记录任何内容,尽管里面有一些Log::info()
。它还很高兴让我执行多个artisan schedule:run
命令而不检查任务是否完成。
其他可能性(对于artisan
命令)可能是直接使用Symfony的Process类来启动后台进程:
use Symfony\Component\Process\Process;
[...]
protected function schedule(Schedule $schedule) {
$schedule->call(function() {
return (new Process('php artisan test:test'))->start();
})->everyMinute();
}
在这种情况下,脚本不会检查重叠的任务,添加withoutOverlapping()
可能还不够 - 您宁愿编写自己的方法来添加/删除互斥锁并在例如任务本身。