Tutoriel sur l'opération la plus élémentaire d'utilisation de Queue dans Laravel

jacklove
Libérer: 2023-04-02 12:52:01
original
2489 Les gens l'ont consulté

Le service de file d'attente Laravel fournit une API unifiée pour diverses files d'attente en arrière-plan. L'article suivant vous présente principalement le didacticiel d'opération le plus élémentaire sur l'utilisation de Queue dans Laravel. L'article le présente en détail à travers un exemple de code que vous pouvez utiliser. comme référence, jetons un œil ci-dessous.

Préface

Le service de file d'attente dans Laravel n'est pas différent des autres services de file d'attente. Ce sont les plus simples et les plus courants. conforme à la pensée humaine.Le processus : il y a un endroit pour stocker les informations de la file d'attente, un processus PHP écrit des tâches lors de son exécution et un autre processus démon PHP interroge les informations de la file d'attente, exécute et supprime les tâches qui répondent aux exigences d'exécution. Étant donné que PHP est un langage synchrone basé sur les URL et intrinsèquement bloquant, il n'est pas surprenant que Laravel fournisse un outil démon pour interroger et exécuter les informations de file d'attente.

C'était la première fois que j'entrais en contact avec la file d'attente de Laravel au cours des deux derniers jours, et cela a pris beaucoup de temps. . . Après beaucoup de travail acharné, j'ai toujours l'impression de ne pas savoir comment utiliser Laravel. La documentation est relativement simple et résumée, et il est un peu difficile de lire le code source (mais lire le code source et déboguer et vérifier lentement. c'est toujours le plus fiable).

Ce qui suit est une de mes démos simples, qui n'utilise que les opérations les plus élémentaires de la file d'attente. Les opérations plus avancées nécessitent plus de temps :)

Comme moi, il existe quelques files d'attente pour commencer. avec Laravel, les étudiants en difficulté peuvent communiquer entre eux.

Configuration

Ajouter le package Redis

dans composer.json Ajoutez "predis/predis": "~1.0" à la section require, puis composez pour le mettre à jour.

database.php

Configurez la partie base de données redis dans le fichier de configuration database.php Il existe une connexion par défaut, utilisez simplement ceci : )

Selon les éléments de configuration requis dans cette connexion par défaut, modifiez le fichier de configuration .env et remplissez REDIS_HOST, REDIS_PASSWORD et REDIS_PORT avec les valeurs correspondantes de Redis sur votre propre serveur.

queue.php

Vous devez d'abord configurer QUEUE_DRIVER dans .env Parce que vous prévoyez d'utiliser Redis maintenant, configurez-le sur redis.

Configurez ensuite la connexion redis dans la section connexions de queue.php, où la valeur correspondante de connection est la connexion par défaut de redis dans database.php.

Classe de tâches

L'étape suivante consiste à écrire la classe d'opération réelle. Laravel fournit la commande artisanale pour simplifier la création de. classes de tâches :

php artisan make:job Demo
Copier après la connexion

Le répertoire Jobs sera généré dans le répertoire app, qui contient déjà la classe de tâches Demo.php.

Lumen n'a pas cette commande artisanale, mais c'est très pratique. Par défaut, il y aura un ExempleJob.php déjà écrit, copiez-le simplement et changez le nom.
Écrivez d'abord un test de sortie de journal simple. Dans la méthode handle :

Log::info('Hello, queue');
Copier après la connexion

Émettre une tâche

Écrivez maintenant une fonction d'entrée pour pousser la tâche dans la file d'attente. Utilisez la fonction auxiliaire dispatch() :

Utilisez la méthode suivante dans Laravel :

Demo::dispatch();
Copier après la connexion

Utilisez la méthode suivante dans Lumen :

dispatch(new Demo);
Copier après la connexion

File ouverte

Si tout se passe bien, c'est la dernière étape. Exécuté dans la ligne de commande :

php artisan queue:listen --queue=default
Copier après la connexion

Il surveillera la file d'attente et affichera un état d'exécution simple, tel que :

[2017-11-07 02:12:47] Processing: App\Jobs\Demo
[2017-11-07 02:12:47] Processed: App\Jobs\Demo
Copier après la connexion

Une fois qu'il n'y a aucun problème, vous pouvez laisser ce script de file d'attente s'exécuter en arrière-plan :

php artisan queue:work --daemon --quiet --queue=default 1>> /dev/null 2>&1
Copier après la connexion

Entrez la première étape :)

Lors du passage à la file d'attente, il est généralement nécessaire de transmettre des paramètres, alors comment les transmettre ici ?

Passer des paramètres

Passer dans

La méthode de transmission des paramètres dans la fonction d'entrée est comme suit :

La méthode suivante est utilisée dans Laravel :

$param = 'Stephen';
Demo::dispatch($param);
Copier après la connexion

La méthode suivante est utilisée dans Lumen :

$param = 'Stephen';
dispatch(new Demo($param));
Copier après la connexion

Recevoir

La méthode de réception des paramètres dans la classe de tâches est la suivante :

protected $param;
/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($param)
{
  $this->param = $param;
}
/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
  Log::info('Hello, ' . $this->param);
}
Copier après la connexion

C'est ma première tentative. Il existe de nombreuses utilisations avancées, telles que la distribution retardée, la gestion des erreurs, la priorité, la gestion des échecs, etc. Je continuerai à écrire. l'avenir :)

Multi-file d'attente

C'est une question qui doit être prise en compte Il m'est impossible de mettre. toutes les tâches dans une file d'attente appelée par défaut, ce qui rend difficile la gestion de la file d'attente.

Pour spécifier différentes files d'attente, c'est très simple. Il suffit de suivre la méthode onQueue() immédiatement après dispatch() :

Demo::dispatch()->onQueue('emails');
Copier après la connexion

Non, je ne semble pas avoir défini cette file d'attente appelée emails. Eh bien, naturellement, nous devons apporter quelques modifications. La file d'attente de configuration redis dans le fichier de configuration queue.php passe de par défaut à {default}. L'effet est que le nom de la file d'attente peut être obtenu dynamiquement pendant l'exécution au lieu de l'être. codé en dur.

Si vous utilisez le framework Lumen, vous obtiendrez une erreur si vous l'écrivez directement : Appel à une fonction membre onQueue() sur une chaîne.

原因在于 Lumen 的 Job 基类中并没有使用 Illuminate\Foundation\Bus\Dispatchable 这个 trait,而是直接使用 Illuminate\Bus\Queueable 中的 onQueue() 方法。

那么现在就很清楚了,我们的 Job 类使用了 Illuminate\Bus\Queueable 这个 trait,所以需要在 Job 类上调用这个 onQueue() 方法。

$job = new XXXJob();
dispatch($job->onQueue('queue-name'));
Copier après la connexion

当我们在开启队列的时候:

php artisan queue:work --queue=emails
Copier après la connexion

这里指定的队列名 emails 和 dispatch 时指定的队列名保持一致即可。

总结

您可能感兴趣的文章:

详解Yaf框架PHPUnit集成测试方法讲解

快速解决PHP调用Word组件DCOM权限的问题讲解

PHP获取数组中指定的一列实例讲解

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal