5

我们正在尝试使用 PHP Laravel 框架发送批量电子邮件(100k)。哪种方式是使用 Laravel 队列发送批量电子邮件的正确方式?

情况1。

//controller
public function runQueue(){    
    dispatch(new ShootEmailJob());
}

//job 
public function handle(){
        $emails = EmailList::get(['email']);

        foreach($emails as $email){
            Mail::to($email)->send();
        }
 }

案例 2。

//controller
public function runQueue(){

    $emailList = EmailList::get(['email']);

    foreach($emailList as $emailAddress){
        dispatch(new ShootEmailJob($emailAddress->email));
    }
}

//job    
 public function handle(){
    Mail::to($emailAddress)->send(new ShootMail($emailAddress));
 }

哪一个是正确的方法案例 1 或案例 2?

4

1 回答 1

4

第一种方法将首先获取所有电子邮件,然后将它们一个接一个地发送给作为后台进程运行的作业的一个“实例”,如果您将其排队。

第二种方法将运行n作业的“实例”,一个用于后台进程中的每封电子邮件。

所以性能方面的选择1是更好的方法。如果出现异常,您还可以将其包装在一个try - catch块中,以便在其中一封电子邮件失败时作业不会失败,例如:

try {

     $emails = EmailList::get(['email']);

    foreach($emails as $email){
        Mail::to($email)->send();
    }

} catch (\Exception $e) {
   // Log error
   // Flag email for retry
   continue;
}
于 2018-11-13T13:24:52.230 回答