我知道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个成员。
我将要做的是将所有作业推送到队列中,并使其在后台处理而不会影响其他流程。就像其他请求即将到来一样。它应该立即处理它。
答案 0 :(得分:3)
Jobs的工作方式是让您有一个队列工作器(php artisan queue:work
命令)来等待作业处理,然后在计划的时间执行它们。
因此,您必须在开发环境中将其保持在后台运行,以使其能够捕获传入的作业并在适当的时机进行处理。
当您将队列处理器置于后台时,您可以触发将作业推入队列的代码。
第一行将安排作业在三秒钟后运行,因此延迟是执行时间,而不是排队时间。
然后dispatch
函数是实际将作业推送到队列上的助手。
在您推送任务之后,队列处理器会注意到它,并会看到它已被调度了3秒的延迟,因此只有在正确的调度时间到来时,它才会进行处理。
在生产中,必须保留一个执行php artisan queue:work
的后台进程,以便处理队列。 Laravel在有关队列here的文档中也对此进行了解释。
他们使用主管始终使N个php artisan queue:work
实例并行运行,如果其中任何一个失败,它将自动重新启动,因此您的队列将得到正确处理