Maison  >  Article  >  cadre php  >  Parlons du mécanisme de file d'attente de Laravel et comprenons les scénarios d'utilisation des files d'attente.

Parlons du mécanisme de file d'attente de Laravel et comprenons les scénarios d'utilisation des files d'attente.

青灯夜游
青灯夜游avant
2021-12-20 16:52:492586parcourir

Comment utiliser la file d'attente Laravel ? Ci-dessous, la colonne Laraveltutoriel vous présentera comment utiliser les files d'attente Laravel, ainsi que des scénarios d'utilisation des files d'attente, j'espère qu'elle vous sera utile !

Parlons du mécanisme de file d'attente de Laravel et comprenons les scénarios d'utilisation des files d'attente.

Pourquoi ?

Tout d'abord, nous devons savoir pourquoi nous devons utiliser des files d'attente, et que se passera-t-il si nous n'utilisons pas de files d'attente ! Quels sont les avantages et les inconvénients

Nous pouvons donner quelques exemples de scénarios simples.

Envoi d'e-mails

Quels problèmes rencontrez-vous habituellement lors de l'envoi d'e-mails??

  • Envoi lent
  • Échec de l'envoi
  • La fréquence d'envoi est trop élevée, rejetée par le fournisseur de services ou entrée dans le poubelle

Quels sont les avantages de l'utilisation des files d'attente

  • Améliorer la réponse du client

    Lors de l'envoi, nous ne le traitons pas immédiatement, mais le lançons au serveur, et la file d'attente est gérée et planifiée. Vous pouvez personnaliser l'option d'envoi immédiat ou retarder l'envoi en fonction de la configuration

  • Améliorer la tolérance aux pannes

    Pendant le processus d'envoi, nous pouvons constater que la cible est rejetée. Par exemple, la plupart des gens seront confrontés au scénario d'envoi de l'erreur 502 à admin@qq.comn. Ensuite, ce scénario, puis ce scénario, nous pouvons le comprendre comme un événement. Dans le processus d'envoi d'e-mails, nous pouvons déclencher et construire les événements suivantsadmin@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

Échec de l'envoiEnregistrement d'e-mail dans la base de données

Exception de code

Rappel lorsque l'e-mail est envoyé avec succès

Réessayez en cas d'échec de l'envoi

L'envoi via cet e-mail peut entraîner plusieurs tâches fastidieuses, nous pouvons donc créer plusieurs

services de file d'attente

. Chaque file d'attente gère ses propres choses, très

découplées

Elles

peuvent être très bien configurées via la file d'attente Laravel
Envoyer immédiatement

,

Envoi différé
,

Réessayer d'envoyer

La fréquence d'envoi est contrôlable

Développeurs ceux qui ont utilisé des emails envoyés par lots rencontreront inévitablement un problème, c'est-à-dire que si nous les envoyons directement par lots, c'est-à-dire qu'un grand nombre d'e-mails sont envoyés en même temps. Ensuite, le fournisseur de services de messagerie est susceptible de rejeter notre e-mail ou

l'e-mail sera mis à la poubelle et sera identifié comme publicité

. Ensuite, voici l'

envoi différé

Nous pouvons l'utiliser sur la base des informations connues. dans le service de file d'attente actuel. Pour les e-mails en attente de livraison, vous pouvez configurer la fréquence de manière raisonnable ou modifier la configuration de la messagerie pour obtenir une fréquence contrôlable.
  • Par exemple, définissez une configuration à envoyer 10 fois par minute, etc. De même, nous pouvons réaliser

    configuration, contrôle de fréquence, découplage du contrôle de transmission

  • autres

    Bien sûr, nous l'utiliserons dans de nombreuses situationstéléchargement côté serveur Excel

    multitâche asynchrone côté serveur du Big Data

  • Traitement des messages d'erreur
  • Comment utiliser la file d'attente Laravel

Voici juste une liste de directives d'utilisation générales et comment mieux l'utiliser. Le code peut ne pas fonctionner correctement, l'essentiel est de comprendre la logique Nous utilisons Redis comme pilote ici

🎜🎜🎜🎜Le pilote est défini sur Redis🎜🎜🎜
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);
    }
}
🎜🎜🎜Créez rapidement des files d'attente et des tâches de livraison🎜🎜🎜
# 延迟 2分钟 发送
# 这里使用的是 Crontab 包 (不过 Laravel 自带)
EmailJob::dispatch()->delay(now()->addMinutes(2));

# 立即发送 (不会进入到队列中)
EmailJob::dispatchNow();
🎜Générez automatiquement app/Jobs/EmailJob.php🎜<pre class="brush:js;toolbar:false;">public function __construct(array $data) { # 使用 emailQueue $this-&gt;onQueue(&amp;#39;emailQueue&amp;#39;); $this-&gt;data = $data; }</pre>🎜🎜Quelques opérations courantes🎜🎜🎜🎜Ces opérations peuvent être trouvées dans la documentation🎜🎜🎜Call send🎜<pre class="brush:js;toolbar:false;"># 重试 5 次 public $tries = 5;</pre>🎜La file d'attente ici utilise la file d'attente par défaut, nous pouvons la modifier pour spécifier le service de file d'attente🎜 <pre class="brush:js;toolbar:false;">/** * 确定任务应该超时的时间 * * @return \DateTime */ public function retryUntil() { return now()-&gt;addMinutes(10); }</pre>🎜Échec de la configuration Dans ce cas, le nombre de tentatives🎜<pre class="brush:js;toolbar:false;">php artisan queue:work --queue=emailQueue</pre>🎜Définir le délai d'attente🎜<pre class="brush:js;toolbar:false;"># 创建 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 = &amp;#39;system&amp;#39;) { $this-&gt;data = $data; $this-&gt;tag = $tag; } } # 创建 listener php artisan make:listener FailListener class FailListener { /** * Handle the event. * * @param object $event * @return void */ public function handle(FailEvent $event) { $this-&gt;{$event-&gt;tag}($event-&gt;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 =&gt; [ FailListener::class, ], ] # 投递 event(new FailEvent([&amp;#39;error&amp;#39; = &amp;#39;异常信息&amp;#39;], &amp;#39;email&amp;#39;));</pre>🎜Démarrer notre file d'attente🎜🎜🎜Si vous ne configurez pas onQueue, vous pouvez le configurer sans le paramètre ---queue🎜🎜rrreee 🎜🎜Combiné avec des événements pour découpler🎜🎜🎜🎜 L'événement Laravel est également implémenté via des files d'attente🎜🎜rrreee🎜🎜Autres🎜🎜🎜En fait, Laravel m'a surtout aidé à mettre en œuvre l'ensemble du processus. Vous pouvez essayer d'utiliser Redis pour implémenter vous-même une file d'attente contrôlable. La maîtrise est tout ce dont vous avez besoin pour maîtriser les types de données liés à Redis. Voici une brève liste des types de données utilisés dans les modes ci-dessus dans Redis🎜🎜🎜🎜List🎜🎜L'utiliser peut compléter la fonction de file d'attente de popping et push 🎜🎜🎜🎜Hash🎜🎜L'utiliser peut être utilisé pour stocker des séquences après l'🎜Event🎜 ou 🎜Job🎜 🎜__construct🎜 est transmis, essayez de ne pas sérialiser la classe entière 🎜🎜 peut également être stockée. Les ensembles🎜 sont triés par scores pour trouver les tâches de file d'attente que nous souhaitons exécuter récemment🎜🎜🎜🎜Bien sûr, il existe de nombreuses autres utilisations de Redis, il suffit de répondre à vos propres besoins. 🎜<blockquote><p>Il n'y a pas de solution parfaite au monde, seulement la solution qui vous convient le mieux. Lorsque vous rencontrez des problèmes au travail, essayez d'apprendre à tirer des conclusions à partir d'un exemple, à utiliser raisonnablement divers outils et à concevoir des solutions pour y parvenir. Le code n'est que le microcosme final. La dernière chose est d'apprendre à comprendre. Chaque langage et chaque framework n'est que la mise en œuvre d'une solution. Ce n'est qu'en le maîtrisant que vous pourrez être invincible... </p></blockquote> <p>Pour plus de connaissances liées à la programmation. , veuillez visiter : <a href="https://www.php.cn/course.html" target="_blank" textvalue="编程入门">Introduction à la programmation</a> ! ! </p>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer