如果我有 1000 封电子邮件,我运行的作业会检查这 1000 封电子邮件并发送电子邮件。
我本可以有:
$users = User::all();
$count = 0;
$hours = 0;
foreach($users as $user) {
if($count % 100 === 0) {
$hours++;
}
Main::to($user->email)->later(now()->addHours($hours), new MyEmail($user));
$count++;
}
Run Code Online (Sandbox Code Playgroud)
我尚未对此进行测试,但我想每小时发送 100 封电子邮件,这是正确的方法吗?
sleep(1);在这里没有帮助,你的解决方案没问题,只要记住前 100 个将延迟一个小时。Laravel 文档
另外,正如您所说MailTrap,在几秒钟内只允许发送 2 封电子邮件,您可以为每封电子邮件添加几小时+几秒100,这样100批量中的每封电子邮件都会从 1 到 100 延迟 1 小时+秒;
或者另一个解决方案使用--sleep=3params in queue:work,这将处理 1 封电子邮件睡眠 3 秒等。
这将在(Redis /数据库)中创建一个队列,具体取决于您正在使用的内容,并将在指定的日期时间处理它们。
$users = User::all();
$count = 0;
$hours = 0;
foreach($users as $user) {
if($count % 100 === 0) {
$hours++;
}
Mail::to($user)->later(now()->addHours($hours), new MyEmail($user));
$count++;
}
Run Code Online (Sandbox Code Playgroud)