在Laravel的Paraller任务schedulling

时间:2016-11-17 12:41:12

标签: laravel crontab scheduling

您好我有关于任务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控制器作为并行计划任务运行?

1 个答案:

答案 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()可能还不够 - 您宁愿编写自己的方法来添加/删除互斥锁并在例如任务本身。