Laravel:Mail :: queue和$ this-> dispatch之间有什么区别?

Cof*_*fee 7 php email queue laravel laravel-5.2

所以我目前正在阅读关于邮件排队的Laravel文档,我已经失去了想法,Mail::queue(<params>)和之间的区别是什么$this->dispatch(new SendMail(<params>)).因为在Laravel文档的Mail部分中给出了第一个变体,但随后它被称为"不要忘记首先配置你的队列".我去了Queue配置部分,在那里我发现"添加一些东西到队列只需使用$this->dispatch($job)".

所以,我做了两个变种:其中一个看起来如下:

Mail::queue('emails.template', 
   ['name'=>$name, 'msg'=>$message], 
   function($msg) use ($email){
   $msg->to($email)
   ->subject('Application received');
  }
);
Run Code Online (Sandbox Code Playgroud)

第二个,在同一个控制器中,但其他方法,只是:

$this->dispatch(new SendEmail($name, $message, $email));
Run Code Online (Sandbox Code Playgroud)

在第二个变体中,我使用job,该handle()方法与之前的代码相同,只是使用Mail::send.

在两种变体中,用户必须等待相同的长时间,php artisan queue:listen保持沉默,但电子邮件已成功发送.

我该怎么做才能澄清我的情况?非常感谢任何可能的帮助!

100*_*les 1

就像 Laravel 的许多部分一样,通常有一种简单的方法来做某事,然后有一种方法可以给你更多的控制权。两种发送电子邮件的方法略有不同。让我们来看看他们两个......

Mail::queue()

  • 使用外观访问器
  • 实际方法位于Illuminate\Mail\Mailer::queue()
  • 通过接受电子邮件模板/视图、任何关联的发送数据以及回调函数(如果我们想指定一个),为您完成繁重的工作吗?
  • 可以在任何地方调用,无需额外配置或创建新类
  • 会将要发送的新电子邮件直接推送到您的队列中。

$this->dispatch(new SendReminderEmail())

  • 手动调度作业(在本例中为SendReminderEmail作业实例)
  • 需要在控制器中使用,因为关联的dispatch方法仅在特征中可用DispatchesJobs
  • 此方法调度关联的作业。在此示例中,暗示SendReminderEmail实际上会将新电子邮件推送到队列。
  • 如果您希望增强对分派的实际作业的控制,请使用此选项。您可以在此处添加与发送电子邮件相关的任何其他功能。例如,也许有自定义逻辑可以在发送电子邮件之前对其内容进行过滤。
  • 您将需要手动创建作业,而Mail外观已经包含该作业,隐藏在我们的实现之外。

有点不幸的是,5.2 文档使用邮件作为事件分派的示例,因为大多数开发人员只会使用Mail::queue(). 这里的混乱是有道理的。

至于队列的速度,我不确定为什么你的队列会比预期的慢,抱歉!