Maison  >  Article  >  cadre php  >  Que se passe-t-il lorsque la file d'attente Laravel échoue ?

Que se passe-t-il lorsque la file d'attente Laravel échoue ?

PHPz
PHPzoriginal
2023-04-23 09:08:281165parcourir

Lors de l'utilisation de la file d'attente Laravel, nous pouvons rencontrer un échec d'exécution des tâches. À l’heure actuelle, Laravel propose une bonne solution, qui consiste à utiliser une file d’attente d’échecs.

Lorsque nous exécutons des tâches en file d'attente, nous pouvons placer les tâches ayant échoué dans une file d'attente spécialement conçue pour gérer les tâches ayant échoué, puis vérifier régulièrement cette file d'attente et réexécuter les tâches ayant échoué. De cette façon, nous pouvons éviter que les tâches de la file d'attente ne soient interrompues en raison de problèmes mineurs et continuer à nous servir.

La file d'attente d'échecs de Laravel fournit plusieurs configurations et interfaces extensibles, que nous pouvons configurer en fonction de nos propres besoins.

Tout d'abord, nous devons définir la file d'attente dans laquelle les tâches ayant échoué doivent entrer dans le fichier de configuration config/queue.php. La clé de cet élément de configuration est failed et sa valeur est un tableau qui contient deux éléments de configuration : driver et queue. L'élément de configuration driver indique quel pilote d'échec nous voulons utiliser. Laravel fournit deux pilotes d'échec, database et redis, par défaut. Et queue indique dans quelle file d'attente la tâche ayant échoué entrera. config/queue.php 中设置失败的任务应该进入的队列。该配置项的键为 failed,其值为一个数组,其中包含 driverqueue 两个配置项。driver 配置项表示我们希望使用哪个失败驱动,Laravel 默认提供了 databaseredis 两个失败驱动。而 queue 则表示失败任务将进入哪个队列。

'failed' => [
    'driver' => 'database',
    'queue' => 'failed',
],

如果我们希望使用其他的失败驱动,我们可以通过注册自定义失败驱动并在 driver 配置项中引用它来实现。

注册自定义驱动的代码如下所示:

Queue::failing(function ($connection, $job, $data) {
    // 自定义处理逻辑
});

接下来,我们需要定义处理失败任务的具体逻辑。我们可以直接将失败任务再次推入队列中,这样在下一次队列处理时该任务就会再次被执行。或者,我们也可以将失败任务的一些信息存储下来以备后续检查以及处理。

对于将失败任务推入队列的处理方式,我们可以使用以下代码:

Queue::failing(function ($connection, $job, $data) {
    $queue = $job->getQueue();
    $payload = $job->payload();

    Queue::pushRaw($payload, $queue);
});

这段代码将失败任务重新推到了原始队列中,等待下一次被执行。

而对于将失败任务信息存储的处理方式,我们可以使用以下代码:

Queue::failing(function ($connection, $job, $data) {
    // 将失败任务信息存储到数据库中
    DB::table('failed_jobs')->insert([
        'connection' => $connection,
        'queue' => $job->getQueue(),
        'payload' => $job->getRawBody(),
        'exception' => $data['exception'],
        'failed_at' => now(),
    ]);
});

这段代码将失败任务的信息存储到数据库表 failed_jobs 中,以便我们稍后进行检查以及处理。

除了以上两种处理方式,Laravel 还提供了更多的处理方式供我们选择。我们可以查看 Laravel 的文档以及源代码以了解更多详情。

最后,我们需要定期检查失败队列并重试其中的任务。Laravel 默认提供了 queue:retry 命令来进行任务重试,该命令接受一个可选参数 --queue,表示我们要重试的任务队列。如果不指定该参数,则默认重试所有队列。

php artisan queue:retry 5 --queue=my-queue

该命令将会从失败队列中的 my-queue 队列中重新执行前 5 个失败任务。

除此之外,我们还可以使用操作系统的定时任务工具(如 crontab)来周期性地执行 queue:retryrrreee

Si nous voulons utiliser d'autres pilotes d'échec, nous pouvons le faire en enregistrant un pilote d'échec personnalisé et en le référençant dans l'élément de configuration driver.

Le code pour enregistrer un pilote personnalisé est le suivant :

rrreee

Ensuite, nous devons définir la logique spécifique de gestion des tâches ayant échoué. Nous pouvons directement placer à nouveau la tâche ayant échoué dans la file d'attente, afin que la tâche soit à nouveau exécutée lors du prochain traitement de la file d'attente. Alternativement, nous pouvons également stocker certaines informations sur les tâches ayant échoué pour une inspection et un traitement ultérieurs. 🎜🎜Pour la méthode de traitement consistant à placer la tâche ayant échoué dans la file d'attente, nous pouvons utiliser le code suivant : 🎜rrreee🎜Ce code repousse la tâche ayant échoué dans la file d'attente d'origine, en attendant d'être exécutée la prochaine fois. 🎜🎜Quant à la façon de stocker les informations sur les tâches ayant échoué, nous pouvons utiliser le code suivant : 🎜rrreee🎜Ce code stocke les informations sur les tâches ayant échoué dans la table de base de données failed_jobs afin que nous puissions les vérifier ultérieurement et les traiter. 🎜🎜En plus des deux méthodes de traitement ci-dessus, Laravel nous propose également davantage de méthodes de traitement parmi lesquelles choisir. Nous pouvons consulter la documentation et le code source de Laravel pour plus de détails. 🎜🎜Enfin, nous devons vérifier périodiquement la file d'attente des échecs et réessayer les tâches qu'elle contient. Laravel fournit la commande queue:retry par défaut pour réessayer les tâches. Cette commande accepte un paramètre facultatif --queue, qui représente la file d'attente des tâches que nous voulons réessayer. Si ce paramètre n'est pas spécifié, toutes les files d'attente seront réessayées par défaut. 🎜rrreee🎜Cette commande réexécutera les 5 premières tâches ayant échoué de la file d'attente my-queue dans la file d'attente des échecs. 🎜🎜De plus, nous pouvons également utiliser l'outil de tâches planifiées du système d'exploitation (tel que crontab) pour exécuter périodiquement la commande queue:retry afin de gérer régulièrement les tâches ayant échoué. 🎜🎜En bref, la file d'attente d'échec de Laravel fournit une solution très utile pour gérer l'échec des tâches de file d'attente. Nous pouvons le configurer en fonction de nos propres besoins et gérer les tâches ayant échoué de différentes manières. Dans le même temps, nous devons également vérifier régulièrement la file d'attente des échecs et réessayer les tâches qu'elle contient pour nous assurer que les tâches de la file d'attente peuvent s'exécuter normalement. 🎜🎜J'espère que cet article sera utile à tout le monde. 🎜

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