Heim  >  Artikel  >  PHP-Framework  >  Lassen Sie uns über den Warteschlangenmechanismus von Laravel sprechen und die Nutzungsszenarien von Warteschlangen verstehen.

Lassen Sie uns über den Warteschlangenmechanismus von Laravel sprechen und die Nutzungsszenarien von Warteschlangen verstehen.

青灯夜游
青灯夜游nach vorne
2021-12-20 16:52:492479Durchsuche

Wie verwende ich Laravel Queue? Unten wird Ihnen in der LaravelTutorial-Kolumne die Verwendung von Laravel-Warteschlangen sowie Szenarien für die Verwendung von Warteschlangen vorgestellt. Ich hoffe, dass sie für Sie hilfreich sein wird!

Lassen Sie uns über den Warteschlangenmechanismus von Laravel sprechen und die Nutzungsszenarien von Warteschlangen verstehen.

Warum?

Zuallererst müssen wir wissen, warum wir Warteschlangen verwenden müssen und was passiert, wenn wir keine Warteschlangen verwenden! Was sind die Vor- und Nachteile

Wir können einige Beispiele für einfache Szenarien nennen.

Versenden von E-Mails

Welche Probleme haben Sie im Allgemeinen beim Versenden von E-Mails? Mülleimer

  • Was sind die Vorteile der Verwendung von Warteschlangen?
  • Kundenreaktion verbessern

Beim Senden verarbeiten wir es nicht sofort, sondern werfen es auf den Server, und die Warteschlange wird verwaltet und geplant. Sie können die Option zum sofortigen Senden oder Verzögern des Sendens entsprechend der Konfiguration anpassen

    Fehlertoleranz verbessern
  • Während des Sendevorgangs kann es vorkommen, dass das Ziel abgelehnt wird. Die meisten Menschen werden beispielsweise auf das Szenario stoßen, dass Fehler 502 an admin@qq.comn gesendet wird. Dann können wir dieses Szenario, dann dieses Szenario als Ereignis verstehen. Während des E-Mail-Versands können wir die folgenden Ereignisse auslösen und erstellen: Fehler beim Senden des E-Mail-Datensatzes in die Datenbank. Code-Ausnahme: Rückruf, wenn die E-Mail erfolgreich gesendet wurde

    Erneuter Versuch, wenn der Versand fehlschlägt

  • Das Senden über diese E-Mail kann mehrere zeitaufwändige Aufgaben verursachen, sodass wir tatsächlich mehrere

    Warteschlangendienste

    erstellen können. Jede Warteschlange verwaltet ihre eigenen Dinge, sehr

    entkoppeltadmin@qq.comn 发送报错 502 的场景。 那这种场景,那么这种场景,我们可以理解其为是一个事件,在邮件发送的过程中,我们可以 引发构建出如下几种事件

    • 发送失败
    • 邮件记录入库
    • 代码异常
    • 邮件发送成功回调
    • 发送失败重试

    通过此邮件发送,可能会导致多个耗时任务的产生,那我们其实也可以构建出多个 队列服务 出来。每个队列管理 自己的事情,很好的 解耦 他们

    通过 Laravel 队列 可以很好的进行设置 立即发送延迟发送重试发送

  • 发送频率可控

    使用过批量发送的邮件的 开发者 必然会遇到一个问题,那便是,如果我们直接进行批量发送,即同一时间 进行大量的邮件发送。那么邮件服务商很可能会把我们的邮件给拒绝 或者 邮件进入垃圾箱,被识别为 广告那么,这里便是用到了 延迟发送,我们可以根据当前队列服务中,已知的 正在等待 投递的邮件,合理的配置频率,或者 切换邮件配置,来达到,频率可控。

    如设置 一个配置一分钟之类发送10次,等等方案。 同样,我们这里可以做到 配置、频率控制、发送控制 解耦

其他

当然 我们还有很多种情况都会用到

  • 服务器端下载 excel
  • 服务器端异步多任务处理 大数据
  • 错误消息处理

如何使用 Laravel 队列

这里只是列出,大概的使用方向,和如何更好的去使用。代码可能跑不起起来,主要是理解 逻辑 我们这里 使用的是 Redis 作为驱动

驱动设置为 Redis

> .env
QUEUE_CONNECTION=redis
> 在 config/queue.php 中可以找到

快速创建队列 和 投递任务

# 创建 任务
php artisan make:job ProcessPodcast

自动生成 app/Jobs/EmailJob.php Sie

können sehr gut über die Laravel-Warteschlange eingerichtet werden Sofort senden,

Senden verzögern
,

Senden erneut versuchen

Die Sendefrequenz ist steuerbar

Entwickler Wer stapelweise versendete E-Mails verwendet hat, wird unweigerlich auf ein Problem stoßen, das heißt, wenn wir sie direkt stapelweise versenden, also eine große Anzahl von E-Mails gleichzeitig versenden. Dann wird der E-Mail-Dienstleister unsere E-Mail wahrscheinlich ablehnen oder

die E-Mail wird in den Papierkorb verschoben

und als

Werbung

identifiziert. Hier ist also der

verzögerte Versand
, wir können ihn basierend auf den bekannten Informationen in verwenden Der aktuelle Warteschlangendienst Für E-Mails, die auf die Zustellung warten, können Sie die Häufigkeit entsprechend konfigurieren oder die E-Mail-Konfiguration ändern, um eine steuerbare Häufigkeit zu erreichen.

Legen Sie beispielsweise eine Konfiguration fest, die 10 Mal pro Minute usw. gesendet wird. In ähnlicher Weise können wir hier eine
Konfiguration, Frequenzsteuerung und Übertragungssteuerungsentkopplung erreichen

Andere

Natürlich werden wir es in vielen Situationen verwenden Asynchrones Multitasking von Big Data. Fehlernachrichtenverarbeitung. Der Code läuft möglicherweise nicht gut. Die Hauptsache ist, die Logik zu verstehen Wir verwenden hier Redis als Treiber.

  • Der Treiber ist auf Redis eingestellt /code >

    class EmailJob implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        protected $data;
    
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct(array $data)
        {
            $this->data = $data;
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            $service = new EmailService();
    
            // ... 检查当前可用 Mailer
            // 这里你自定义就好了,这个方法中你可以根据你自己的配置,获取到当前可用的配置
            $mailer = $service->getMailer();
    
            // ... 获取当前要发送的数据
            $data = $this->data;
            
            $service->send($mailer, $data);
        }
    }

    Einige allgemeine Vorgänge

  • Diese Vorgänge finden Sie in der Dokumentation

    Anruf senden

    # 延迟 2分钟 发送
    # 这里使用的是 Crontab 包 (不过 Laravel 自带)
    EmailJob::dispatch()->delay(now()->addMinutes(2));
    
    # 立即发送 (不会进入到队列中)
    EmailJob::dispatchNow();
    Die Warteschlange hier verwendet standardmäßig die Standardwarteschlange. Wir können sie ändern, um den Warteschlangendienst anzugeben
    public function __construct(array $data)
    {
        # 使用 emailQueue
        $this->onQueue('emailQueue');
        $this->data = $data;
    }
    Einrichten des Fehlers In diesem Fall die Anzahl der Wiederholungsversuche
    # 重试 5 次
    public $tries = 5;

    Stellen Sie das Zeitlimit ein

    /**
    * 确定任务应该超时的时间
    *
    * @return \DateTime
    */
    public function retryUntil()
    {
        return now()->addMinutes(10);
    }

    Starten Sie unsere Warteschlange
  • Wenn Sie onQueue nicht konfigurieren, können Sie es ohne den ---queue-Parameter konfigurieren

    php artisan queue:work --queue=emailQueue
    Kombiniert mit Events zum Entkoppeln

Laravel Event wird auch über Warteschlangen implementiert

🎜
# 创建 Event
php artisan make:event FailEvent

class FailEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    protected $data;
    protected $tag;

    /**
     * @param array $data 投递的数据
     * @param string $tag 要操作的事情
     */
    public function __construct(array $data, string $tag = 'system')
    {
        $this->data = $data;
        $this->tag = $tag;
    }
}

# 创建 listener 
php artisan make:listener FailListener
class FailListener
{
    /**
    * Handle the event.
    * 
    * @param  object  $event
    * @return void
    */
    public function handle(FailEvent $event)
    {
        $this->{$event->tag}($event->data);
    }

    /**
     * 处理系统异常
     * DateTime: 2021/12/3 11:02 上午
     * @param array $data
     */
    public function system(array $data)
    {

    }

    /**
    * 处理邮件异常
    * DateTime: 2021/12/3 11:02 上午
    */
    public function email()
    {
    
    }

}

# app/Providers/EventServiceProvider.php
protected $listen = [
    FailEvent::class => [
        FailListener::class,
    ],
]

# 投递
event(new FailEvent(['error' = '异常信息'], 'email'));
🎜🎜Andere🎜🎜🎜Tatsächlich hat mir Laravel größtenteils bei der Implementierung des gesamten Prozesses geholfen. Sie können versuchen, mit Redis selbst eine steuerbare Warteschlange zu implementieren. Kenntnisse sind alles, was Sie brauchen, um Redis-bezogene Datentypen zu beherrschen. Hier ist eine kurze Liste der Datentypen, die in den oben genannten Modi in Redis verwendet werden Das 🎜Event🎜 oder 🎜Job🎜 🎜__construct🎜 wird übergeben. Versuchen Sie, nicht die gesamte Klasse zu serialisieren. 🎜🎜 Mailer-Daten können auch in 🎜Sorted Set gespeichert werden Set🎜 werden nach Punktzahlen sortiert, um die Warteschlangenaufgaben zu finden, die wir kürzlich ausführen möchten🎜🎜🎜🎜Natürlich gibt es viele andere Einsatzmöglichkeiten von Redis, die einfach Ihren eigenen Bedürfnissen entsprechen. 🎜

Es gibt keine perfekte Lösung auf der Welt, sondern nur die Lösung, die am besten zu Ihnen passt. Versuchen Sie zu lernen, aus einem Beispiel Schlussfolgerungen zu ziehen, verschiedene Tools sinnvoll einzusetzen und Lösungen zu entwerfen, um diese zu erreichen. Der Code ist nur der letzte Mikrokosmos. Jede Sprache und jedes Framework ist nur die Implementierung einer Lösung.

Für mehr Programmierkenntnisse , besuchen Sie bitte: Einführung in die Programmierung! !

Das obige ist der detaillierte Inhalt vonLassen Sie uns über den Warteschlangenmechanismus von Laravel sprechen und die Nutzungsszenarien von Warteschlangen verstehen.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen