我有多项任务需要每隔一两个小时完成一次。所有这些都已通过 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
由于 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)
如果您添加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()方法,因为它适用于互斥文件。
现在,您还可以将命令置于版本控制中。
| 归档时间: |
|
| 查看次数: |
2623 次 |
| 最近记录: |