Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel-在多个作业结束后执行作业_Php_Laravel_Email_Queue_Jobs - Fatal编程技术网

Php laravel-在多个作业结束后执行作业

Php laravel-在多个作业结束后执行作业,php,laravel,email,queue,jobs,Php,Laravel,Email,Queue,Jobs,我正在做一个项目,用户给我一些输入,然后我处理这些输入。这种处理需要很长时间,所以我使用队列,我想向用户发送邮件,告知他们处理的数据已在我的应用程序上准备就绪。我想要实现的是,将所有这些作业放入队列中,然后对它们进行处理,当用户的所有处理结束时,向该用户发送邮件 我使用的是两阶段队列。首先,我获取输入并分派一个作业,其中输入被解析并划分为子数据集,然后从该作业分派另一个作业,该作业处理来自第一个作业的解析输入数据。我这样做的原因是,第一个作业比第二个作业花费的时间少,我想使用作业只进行处理,没有

我正在做一个项目,用户给我一些输入,然后我处理这些输入。这种处理需要很长时间,所以我使用队列,我想向用户发送邮件,告知他们处理的数据已在我的应用程序上准备就绪。我想要实现的是,将所有这些作业放入队列中,然后对它们进行处理,当用户的所有处理结束时,向该用户发送邮件

我使用的是两阶段队列。首先,我获取输入并分派一个作业,其中输入被解析并划分为子数据集,然后从该作业分派另一个作业,该作业处理来自第一个作业的解析输入数据。我这样做的原因是,第一个作业比第二个作业花费的时间少,我想使用作业只进行处理,没有任何中断或额外的解析工作,第一个阶段是关于解析的,第二个部分是关于处理的。处理部分可能会失败,如果失败,队列将再次处理它,因此如果我不将输入划分为子作业,作业结束时的失败可能会导致再次完成作业的所有处理

如果我将所有这些作业放在同一队列中,并将该邮件作业分配给
queue::after
方法,则如果我理解正确,用户可能必须等待所有队列完成。我希望能够在处理完用户的所有输入后向用户发送邮件,而无需等待处理任何其他用户的输入。Laravel队列的文档显示了一个示例方法:

Queue::after(function (JobProcessed $event) {
    // $event->connectionName
    // $event->job
    // $event->job->payload()
});
我从中了解到,这在每次处理作业之后都有效,我可以使用
$event
对象访问作业属性。这不适用于我的2阶段队列结构。我知道我可以使用数据库中的一些计数器来检查是否所有的处理都完成了,但我想知道是否有更好、更优雅的方法来实现这一点


非常感谢。

现在已经有几年了,但Laravel 8可能会提供一个解决方案:


作业可以成批运行,在所有作业完成、任何作业失败或所有作业成功完成时调用回调。

最好的办法是在两个作业完成后,让该作业组的Cache或DB值具有特定值,并在after()事件中检查该值。作业的整个概念是具有系统其他部分不知道的自包含流程。