Laravel:任务调度[并行]

时间:2017-07-20 14:33:45

标签: laravel laravel-5

我有多个任务需要每隔一两个小时完成。所有这些都是通过Laravel使用下面的comamnds安排作为cron jobs

$schedule->command('email:notifications1')
            ->cron('15 * * * * *');
$schedule->command('email:notifications2')
            ->cron('15 * * * * *');
$schedule->command('email:notifications3')
            ->cron('15 * * * * *');

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

需求量的 我怎样才能并行运行它们?我希望所有任务在时钟滴答指定时间后立即执行(并行)。

Laravel第5版

2 个答案:

答案 0 :(得分:3)

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

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

15 * * * * * php /path/to/artisan email:notifications1
15 * * * * * php /path/to/artisan email:notifications2
15 * * * * * php /path/to/artisan email:notifications3


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

例如:

$schedule->command('email:notifications1')
            ->cron('5 * * * * *');
$schedule->command('email:notifications2')
            ->cron('10 * * * * *');
$schedule->command('email:notifications3')
            ->cron('15 * * * * *');

答案 1 :(得分:1)

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

$schedule->command('email:notifications1')
            ->cron('15 * * * * *')->runInBackground();
$schedule->command('email:notifications2')
            ->cron('15 * * * * *')->runInBackground();
$schedule->command('email:notifications3')
            ->cron('15 * * * * *')->runInBackground();

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

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