簡體   English   中英

限制 Laravel 中的排隊作業

[英]Limit Queued Job in Laravel

我有一項 email 服務,該服務允許我每小時(1 次/分鍾)僅發送 60 封電子郵件。 所以這就是為什么我試圖編寫一個尊重服務提供商限制的應用程序,我通過隊列作業立即向批量用戶發送電子郵件,請看一下代碼

    public function sendEmails(CreateEmailRequest $request)
{
    $data = [];
    $users = User::find($request->to);
    $subject = $request->subject;
    $body = $this->fileUpload($request->body);
    foreach ($users as  $user) {
        $vars = array(
            "{{name}}" => $user->name,
            "{{email}}" => $user->email,
        );
        $body = strtr($body, $vars);
        $data['body'] =  $body;
        $data['user'] =  $user;
        $data['subject'] =  $subject;
        dispatch(new SendEmailJob($data))->onQueue('mail');
    }


    Flash::success('Email sent successfully.');

    return redirect(route('emails.index'));
}

這是 SendEmailJob Class 代碼

 public function handle()
{
    $data = $this->data;
    $body = $data['body'];
    $user = $data['user'];
    $subject = $data['subject'];
    // list($body, $user, $subject) = $this->data;
    Mail::send('mail.email', ['body' => $body], function ($m) use ($user, $subject) {
        $m->to($user->email)->subject($subject);
    });
}
public function middleware()
{
    return Limit::perMinute(1);
}

當我運行 php artisan queue:work 時,它會同時處理所有作業。您能告訴我如何實現嗎? 我不能使用spatie/laravel-rate-limited-job-middleware因為我的服務器不支持 Redis。你能告訴我我做錯了嗎?

您可以使用具有速率限制的作業中間件

在 AppServiceProvider 的引導方法中

RateLimiter::for('emails', function($job) {
    return Limit::perMinute(1);
});

並將中間件添加到作業中:

use Illuminate\Queue\Middleware\RateLimited;

public function middleware()
{
    return [new RateLimited('emails')];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM