1 回答
TA贡献1833条经验 获得超4个赞
有几种方法可以实现这一目标。在派遣工作之前,您可以添加delay它。例子:
use App\Http\Request;
use App\Jobs\SendEmail;
use App\Mail\VerifyEmail;
use Carbon\Carbon;
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return \Illuminate\Http\RedirectResponse
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
*/
public function store(Request $request)
{
$baseDelay = json_encode(now());
$getDelay = json_encode(
cache('jobs.' . SendEmail::class, $baseDelay)
);
$setDelay = Carbon::parse(
$getDelay->date
)->addSeconds(10);
cache([
'jobs.' . SendEmail::class => json_encode($setDelay)
], 5);
SendEmail::dispatch($user, new VerifyEmail($user))
->delay($setDelayTime);
}
或者,如果您不喜欢某个工作的想法,您也可以通过 推迟它Mail。例子:
Mail::to($user)->later($setDelayTime);
最后通过 Redis 速率限制。例子:
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Redis;
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Redis::throttle('SendEmail')
->allow(1)
->every(10)
->then(function () {
Mail::to($this->user)->send($this->mail);
}, function () {
return $this->release(10);
});
}
允许每十秒发送一封电子邮件。传递给throttle() 方法的字符串SendEmail 是唯一标识受速率限制的作业类型的名称。您可以将其设置为您想要的任何值。
release() 方法是作业类的继承成员,它指示 Laravel 在无法获得锁的情况下将作业释放回队列,并可选择以秒为单位的延迟。当作业被分派到队列时,Redis 被指示每十秒仅运行一个 SendEmail 作业。
- 1 回答
- 0 关注
- 75 浏览
添加回答
举报