如何在Laravel 5.2中自动处理排队的作业

时间:2019-08-07 12:02:35

标签: laravel

我知道dispatch()会将作业推入队列,而php artisan queue:work将对其进行处理。 假设我要发送邮件。

   $emailJob = (new SendEmailJob())->delay(Carbon::now()->addSeconds(3));
   dispatch($emailJob);
   echo "email sent";

此代码是什么意思?将在3秒后发送邮件还是在3秒后将作业推入队列?
如果它将把任务排入队列,我将如何发送它。
部署项目后,我当然不能php artisan queue:work


假设我必须将邮件发送给1000个成员。
我将要做的是将所有作业推送到队列中,并使其在后台处理而不会影响其他流程。就像其他请求即将到来一样。它应该立即处理它。

1 个答案:

答案 0 :(得分:3)

Jobs的工作方式是让您有一个队列工作器(php artisan queue:work命令)来等待作业处理,然后在计划的时间执行它们。

因此,您必须在开发环境中将其保持在后台运行,以使其能够捕获传入的作业并在适当的时机进行处理。

当您将队列处理器置于后台时,您可以触发将作业推入队列的代码。
第一行将安排作业在三秒钟后运行,因此延迟是执行时间,而不是排队时间。
然后dispatch函数是实际将作业推送到队列上的助手。

在您推送任务之后,队列处理器会注意到它,并会看到它已被调度了3秒的延迟,因此只有在正确的调度时间到来时,它才会进行处理。

主管

在生产中,必须保留一个执行php artisan queue:work的后台进程,以便处理队列。 Laravel在有关队列here的文档中也对此进行了解释。

他们使用主管始终使N个php artisan queue:work实例并行运行,如果其中任何一个失败,它将自动重新启动,因此您的队列将得到正确处理