Laravel:任务调度[并行]

6jjcrrmo  于 2023-02-25  发布在  其他
关注(0)|答案(2)|浏览(167)

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

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

**问题:**以上所有任务都非常耗时,从结果来看,这些任务似乎不是并行运行的,而且每个任务都在前一个任务结束后运行。
要求我怎样才能并行运行它们?我希望所有任务在时钟滴答声响到指定时间后立即执行(并行)。

  • 拉瑞维尔第5版 *
xlpyo6sf

xlpyo6sf1#

如果您将runInBackground()(Laravel 5.2中引入的)添加到链中,您可以轻松地运行多个并行命令。

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

这会在后台创建一个新进程,这样调度程序就不必等待命令执行,甚至不会干扰withoutOverlapping()方法,因为它使用互斥文件。
现在,您还可以从版本控制中获得命令的好处。

cuxqih21

cuxqih212#

由于PHP的限制,Laravel调度程序一次只能运行一个命令。
但是,您可以直接在crontab文件中添加cronjob,这样,它们将在单独的进程中并行执行。

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 * * * * *');

相关问题