Maison >cadre php >Laravel >Message Queuing dans Laravel : découplage du traitement des tâches asynchrones

Message Queuing dans Laravel : découplage du traitement des tâches asynchrones

PHPz
PHPzoriginal
2023-08-26 19:15:331294parcourir

Message Queuing dans Laravel : découplage du traitement des tâches asynchrones

Message Queuing dans Laravel : découplage du traitement des tâches asynchrones

Introduction :
Dans le développement Web, la gestion des tâches chronophages est un problème courant. L'approche traditionnelle consiste à effectuer des tâches directement pendant le traitement des requêtes Web, mais cette approche entraînera un ralentissement du temps de réponse de la requête et est sujette au problème de l'impossibilité de réessayer en cas d'échec de la tâche. Afin de résoudre ces problèmes, les files d'attente de messages peuvent être utilisées pour le traitement des tâches asynchrones. Le framework Laravel fournit des fonctions de file d'attente puissantes et faciles à utiliser. Cet article explique comment utiliser les files d'attente de messages dans Laravel pour découpler le traitement des tâches asynchrones.

1. Pourquoi utiliser la file d'attente des messages
L'utilisation de la file d'attente des messages présente les principaux avantages suivants :

  1. Traitement des tâches découplé : en plaçant les tâches dans la file d'attente des messages, le découplage des tâches peut être obtenu. Autrement dit, le déclenchement et l'exécution des tâches peuvent être gérés séparément. L'exécuteur de la tâche n'a besoin que de surveiller la file d'attente sans se soucier des détails du déclenchement de la tâche.
  2. Traitement asynchrone : Après avoir mis la tâche dans la file d'attente des messages, le temps de réponse de la requête web peut être plus rapide car l'exécution de la tâche ne bloquera pas le traitement de la requête web.
  3. Mécanisme de nouvelle tentative : les systèmes de file d'attente de messages fournissent généralement un mécanisme de nouvelle tentative en cas d'échec, qui peut automatiquement réessayer les tâches pour garantir que les tâches peuvent éventuellement être exécutées.

2. Configuration de base du système de file d'attente Laravel
Dans Laravel, l'utilisation de la fonction de file d'attente nécessite une configuration de base. Tout d'abord, vous devez configurer le pilote de file d'attente dans le fichier de configuration de Laravel. Vous pouvez choisir d'utiliser une base de données, Redis, etc. comme stockage de file d'attente. Ajoutez la configuration suivante au fichier .env : .env 文件中:

QUEUE_CONNECTION=database

然后,在Laravel的数据库迁移文件中添加用于存储队列任务的数据表。可以使用以下命令生成迁移文件:

php artisan queue:table

生成的迁移文件中会包含一个名为jobs的数据表。

接下来,运行迁移命令来创建数据表:

php artisan migrate

三、定义队列任务
在Laravel中,队列任务是通过继承IlluminateContractsQueueShouldQueue接口并实现handle方法来定义的。下面是一个示例的队列任务定义:

<?php

namespace AppJobs;

use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $podcast;

    public function __construct($podcast)
    {
        $this->podcast = $podcast;
    }

    public function handle()
    {
        // 处理耗时的任务
        // 例如,发送邮件、生成报表等
    }
}

handle方法中编写具体的任务逻辑。其中,ShouldQueue接口和DispatchableInteractsWithQueueQueueableSerializesModels这几个特质是Laravel队列系统所需的。

四、触发任务
要触发一个队列任务,可以使用dispatch方法。下面是一个触发任务的示例代码:

<?php

use AppJobsProcessPodcast;
use IlluminateHttpRequest;

class PodcastController extends Controller
{
    public function store(Request $request)
    {
        // 处理其他的请求逻辑

        ProcessPodcast::dispatch($podcast)
            ->delay(now()->addMinutes(10));
    }
}

这里,我们使用dispatch方法触发了一个ProcessPodcast任务,并可以设置任务的延迟执行时间。

五、任务的监听与执行
Laravel提供了queue:listen命令来监听并执行队列任务。可以在终端中运行以下命令来启动队列监听器:

php artisan queue:listen

队列监听器将会不断地监听队列并执行任务。

六、重试机制
Laravel队列系统提供了对失败任务的重试机制。如果任务执行失败,队列监听器会自动将其重新放入队列,并根据配置的重试次数进行重试。可以在.env

QUEUE_TRIES=3

Ensuite, ajoutez la table de données utilisée pour stocker les tâches de file d'attente dans le fichier de migration de base de données de Laravel. Vous pouvez utiliser la commande suivante pour générer un fichier de migration :

rrreee

Le fichier de migration généré contiendra une table de données nommée jobs.


Ensuite, exécutez la commande de migration pour créer la table de données :

rrreee🎜3. Définir les tâches de file d'attente🎜Dans Laravel, les tâches de file d'attente héritent de l'interface IlluminateContractsQueueShouldQueue et implémentent la méthode handle. à définir. Voici un exemple de définition de tâche de file d'attente : 🎜rrreee🎜Écrivez une logique de tâche spécifique dans la méthode handle. Parmi eux, l'interface ShouldQueue et les traits Dispatchable, InteractsWithQueue, Queueable, SerializesModels. sont requis par le système de file d'attente de Laravel. 🎜🎜4. Déclencher des tâches🎜Pour déclencher une tâche de file d'attente, vous pouvez utiliser la méthode dispatch. Voici un exemple de code pour déclencher une tâche : 🎜rrreee🎜Ici, nous utilisons la méthode dispatch pour déclencher une tâche ProcessPodcast, et pouvons définir le temps d'exécution différé du tâche. 🎜🎜5. Surveillance et exécution des tâches🎜Laravel fournit la commande queue:listen pour surveiller et exécuter les tâches en file d'attente. Vous pouvez exécuter la commande suivante dans le terminal pour démarrer l'écouteur de file d'attente : 🎜rrreee🎜L'écouteur de file d'attente écoutera en permanence la file d'attente et effectuera des tâches. 🎜🎜 6. Mécanisme de nouvelle tentative 🎜 Le système de file d'attente Laravel fournit un mécanisme de nouvelle tentative pour les tâches ayant échoué. Si l'exécution de la tâche échoue, l'écouteur de file d'attente la remettra automatiquement dans la file d'attente et réessayera en fonction du nombre de tentatives configuré. Le nombre de tentatives peut être configuré dans le fichier .env : 🎜rrreee🎜La configuration ici indique que la tâche sera réessayée jusqu'à 3 fois après un échec. 🎜🎜7. Résumé🎜En utilisant le système de file d'attente Laravel, nous pouvons facilement implémenter un traitement de tâches asynchrone. En plaçant les tâches dans la file d'attente des messages, le découplage des tâches, le traitement asynchrone et les nouvelles tentatives d'échec peuvent être obtenus, améliorant ainsi les performances et la fiabilité des applications Web. Ce qui précède est une introduction de base à l'utilisation des files d'attente de messages pour le traitement des tâches asynchrones dans Laravel. J'espère que cela vous sera utile. 🎜

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn