首页 > 解决方案 > 如何在 laravel 5.2 中自动处理排队的作业

问题描述

我知道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 个成员发送邮件。
我将做什么我会将所有作业推送到队列并让它在后台处理而不影响其他进程。就像其他请求即将到来一样。它应该毫不拖延地处理它。

标签: laravel

解决方案


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

所以你必须在你的开发环境中保持它在后台运行,让它捕捉传入的作业并让它在适当的时候处理。

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

在你推送你的工作之后,队列处理器会注意到它并且会看到它已经被延迟了 3 秒,所以它只会在正确的调度时间到来时处理它。

导师

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

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


推荐阅读