Laravel, begrenzen Sie die Datenbankwarteschlange auf 1 E-Mail pro Minute
P粉310931198
P粉310931198 2023-12-13 14:53:22
0
1
609

Meine App wird auf einer Shared-Hosting-Plattform gehostet, die ein Limit von 200 E-Mails pro Stunde hat.

In meiner Anwendung wird der Database Connection Driver ausgeführt und ich habe 3000 Jobs in der Jobtabelle.

Ich möchte diese Warteschlange so begrenzen, dass nur alle 30 Sekunden oder 1 Minute eine E-Mail gesendet wird, um sicherzustellen, dass es keine Probleme mit meinem Hosting gibt.

Forschung: Ich habe die Verzögerung dieses Tutorials, die Ratenbegrenzung dieser Frage, aber keine Antwort, den Verzögerungsjob dieser Laravel-Dokumentation ausprobiert, aber nichts hat funktioniert.

Frage: Gibt es eine Möglichkeit, die Warteschlange in der Datenbank-Warteschlangenverbindung wie in der Redis-Warteschlangenverbindung zu begrenzen, d. h.

// Allow only 1 email every 30 seconds
Redis::throttle('any_key')->allow(1)->every(30)->then(function () {
    Mail::to($this->email)->send(new NotificationEmail($this->data) );
    Log::info('Emailed order ' . $this->email);
}, function () {
    // Could not obtain lock; this job will be re-queued
    return $this->release(2);
});

Meine Umsetzung: Nur den ersten Auftrag verzögern und andere Aufträge sofort versenden

public function sendEmailNotification($email,$data)
{
    //Send email to user and to admin
    $email_job = (new ProcessEmailNotificationJob($email,$data))->delay(now()->addSeconds(30));
    
    if($this->dispatch($email_job)){
        return true;
    }
    else{
        return false;
    }
}

**ENV-Datei:**

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=database
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

P粉310931198
P粉310931198

Antworte allen(1)
P粉448130258

你运行php artisanqueue:listen了吗,如果是,请检查我下面的代码也许会有帮助

在控制器内:

$mail = (
    [
       'data' => $EmailData,
       'userName' => $userData->first_name,
       'userMail' => $userData->email,
       'subject' => $subject
    ]);
                    
SendMailJob::dispatch($mail)
    ->delay(now()->addSeconds($waitSec));
$waitSec += 30; //seconds interval

SendMailJob 类

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Mail\ClientRegistrationNotification;
use Mail;
class SendMailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $bulkMail, $mail;
    public function __construct($Mail)
    {
        $this->mail=$Mail;
    }

    public function handle()
    {
        try  {
                Mail::to($this->mail['userMail'])
                     ->queue(new ClientRegistrationNotification($this->mail['data'], $this->mail['userName'], $this->mail['userMail'], $this->mail['subject']));

             } catch (\Throwable $exception) {
                $this->fail();
             }
    }
}
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage