我有多个任务需要每隔一两个小时完成。所有这些都是通过Laravel使用下面的comamnds安排作为cron jobs
$schedule->command('email:notifications1')
->cron('15 * * * * *');
$schedule->command('email:notifications2')
->cron('15 * * * * *');
$schedule->command('email:notifications3')
->cron('15 * * * * *');
问题: 所有上述任务都非常耗时且非常耗时。从结果看来,这些任务并不是并行运行的。每个任务都在前一个任务结束后运行。
需求量的 我怎样才能并行运行它们?我希望所有任务在时钟滴答指定时间后立即执行(并行)。
Laravel第5版
答案 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()
方法,因为它适用于互斥文件。
现在,您还可以将命令置于版本控制中。