Heim > Fragen und Antworten > Hauptteil
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粉4481302582023-12-14 09:36:35
你运行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(); } } }