我有一个包含 5000 条记录(5000 个用户)的用户表,在我的服务器中我每小时只能发送 1000 封电子邮件。 我如何使用队列每小时发送 1000 封电子邮件? 或者如何让队列在循环内休眠?
邮件 Controller :
class EmailController extends Controller
{
public function sendEmail(Request $request){
$event=(object)['content' => "Hello Laravel fans",'subject' => 'Test Email'];
$users=User::all();
App\Jobs\SendReminderEmail::dispatch($users,$event)
}
}
发送提醒邮件
class SendReminderEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $event;
public $email;
public $users;
public function __construct($users,$event)
{
$this->users = $users;
$this->event = $event;
}
public function handle()
{
foreach ($this->users as $user) {
Mail::to($user->email)->queue(new Reminder($this->event));
}
}
}
最佳答案
Laravel 有一个非常适合你的情况的简洁功能,它叫做 Task Scheduling ,您可以每小时调用一次,而不是让作业休眠一小时。
为此,将作业计划添加到位于 App\Console\Kernel
的 schedule()
方法中,如下所示:
protected function schedule(Schedule $schedule)
{
$schedule->job(new SendReminderEmail)->hourly();
}
我也建议你把工作做成独立的,这将使这个任务简单得多,我在想这样的事情:
class SendReminderEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $event;
public $users;
public function __construct()
{
$this->users = User::all();
$this->event = (object)['content' => "Hello Laravel fans",'subject' => 'Test Email'];;
}
public function handle()
{
foreach ($this->users as $user) {
Mail::to($user->email)->queue(new Reminder($this->event));
}
}
}
现在你可以摆脱你的 Controller ,因为这个工作将每小时自动执行一次。
请记住,您需要在服务器上运行 cron 以检查是否需要执行作业。如果您想使用 php artisan schedule:run
测试它,您也可以手动运行它。
希望对你有帮助。
关于Laravel:使用队列每小时发送 1000 封电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53117876/