Laravel:任务调度 [并行]

Kni*_*ght 6 laravel laravel-5

我有多项任务需要每隔一两个小时完成一次。所有这些都已通过 Laravel 使用以下命令作为 cron 作业进行调度

$schedule->command('email:notifications1')
            ->cron('15 * * * * *');
$schedule->command('email:notifications2')
            ->cron('15 * * * * *');
$schedule->command('email:notifications3')
            ->cron('15 * * * * *');
Run Code Online (Sandbox Code Playgroud)

问题: 上述所有任务都非常耗时,而且从结果来看,这些任务似乎没有并行运行。每个任务在前一个任务结束后运行。

要求 我如何并行运行它们?我希望一旦时钟在指定时间滴答作响,就可以(并行)执行所有任务。

Laravel 版本 5

Jer*_*dev 8

由于 PHP 的限制,Laravel 调度器一次只能运行一个命令。

但是,您可以将 cronjobs 直接添加到您的 crontab 文件中,这样,它们将在单独的进程中并行执行。

15 * * * * * php /path/to/artisan email:notifications1
15 * * * * * php /path/to/artisan email:notifications2
15 * * * * * php /path/to/artisan email:notifications3
Run Code Online (Sandbox Code Playgroud)


解决此问题的另一种方法是让作业在其他时间开始。因为 cron 作业每分钟都会启动一个新的 php 进程,所以这些不会相互影响。

例如:

$schedule->command('email:notifications1')
            ->cron('5 * * * * *');
$schedule->command('email:notifications2')
            ->cron('10 * * * * *');
$schedule->command('email:notifications3')
            ->cron('15 * * * * *');
Run Code Online (Sandbox Code Playgroud)

  • 第一个选项剥夺了您控制计划版本和代码版本的能力 (2认同)

Ogi*_*vis 6

如果您添加runInBackground()到链中,您可以轻松地运行多个并行命令。像这样:

$schedule->command('email:notifications1')
            ->cron('15 * * * * *')->runInBackground();
$schedule->command('email:notifications2')
            ->cron('15 * * * * *')->runInBackground();
$schedule->command('email:notifications3')
            ->cron('15 * * * * *')->runInBackground();
Run Code Online (Sandbox Code Playgroud)

这会在后台创建一个新进程,因此调度程序不必等到命令执行。这甚至不会干扰该withoutOverlapping()方法,因为它适用于互斥文件。

现在,您还可以将命令置于版本控制中。