Maison  >  Questions et réponses  >  le corps du texte

Laravel, limite la file d'attente de la base de données à 1 e-mail par minute

Mon application est hébergée sur une plateforme d'hébergement mutualisé qui a une limite de 200 emails par heure.

Mon application exécute Database Connection Driver et j'ai 3000 emplois dans la table des emplois.

Je souhaite limiter cette file d'attente à l'envoi d'un seul e-mail toutes les 30 secondes ou 1 minute pour m'assurer qu'il n'y a aucun problème avec mon hébergement.

Recherche : J'ai essayé le retard de ce tutoriel, la limitation de débit de cette question mais pas de réponse, le travail de retard de cette documentation Laravel, mais rien n'a fonctionné.

Question : Existe-t-il un moyen de limiter la file d'attente dans la connexion à la file d'attente de base de données comme dans la connexion à la file d'attente redis, c'est-à-dire

// 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);
});

Mon implémentation : Retarder uniquement le premier travail et envoyer les autres travaux immédiatement

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;
    }
}

**Fichier ENV :**

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

MEMCACHED_HOST=127.0.0.1

P粉310931198P粉310931198334 Il y a quelques jours594

répondre à tous(1)je répondrai

  • P粉448130258

    P粉4481302582023-12-14 09:36:35

    Avez-vous exécuté php artisanqueue:listen Si oui, veuillez vérifier mon code ci-dessous, peut-être que cela vous aidera

    ?

    Au sein du contrôleur :

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

    Classe 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();
                 }
        }
    }

    répondre
    0
  • Annulerrépondre