Maison  >  Article  >  développement back-end  >  L'utilisation de la file d'attente dans Laravel

L'utilisation de la file d'attente dans Laravel

*文
*文original
2018-05-25 13:48:583631parcourir

Laravel Queue Service fournit une API unifiée pour diverses files d'attente en arrière-plan. Cet article vous présente principalement les didacticiels d'opération les plus élémentaires sur l'utilisation de Queue dans Laravel. J'espère que cela aide tout le monde.

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 tout le 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 de lire le code source et de le déboguer et de le vérifier lentement. 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 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

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');

Émission de tâches

Maintenant, écrivez 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();

Utilisez la méthode suivante dans Lumen :

dispatch(new Demo);

Ouvrir la file d'attente

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

php artisan queue:listen --queue=default

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

S'il n'y a pas de problème, vous pouvez laisser ce script de file d'attente exécuter en arrière-plan :

php artisan queue:work --daemon --quiet --queue=default 1>> /dev/null 2>&1

Avancé :)

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);

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

$param = 'Stephen';
dispatch(new Demo($param));

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);
}

Il s'agit de la première tentative. Il existe de nombreuses utilisations avancées, telles que la distribution retardée, la gestion des erreurs. , priorité, gestion des échecs, etc., qui se poursuivront à l'avenir :)

Files d'attente multiples

C'est. un problème qu'il faut considérer. Il m'est impossible de mettre toutes les tâches dans une file d'attente dite par défaut, ce n'est pas facile de gérer la file d'attente.

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

Demo::dispatch()->onQueue('emails');

Non, je ne semble pas avoir défini cela. nom. file d’attente d’e-mails. 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 écrivez ceci directement : Appel à une fonction membre onQueue() sur une chaîne.

La raison est que la classe de base Job de Lumen n'utilise pas le trait IlluminateFoundationBusDispatchable, mais utilise directement la méthode onQueue() dans IlluminateBusQueueable.

Alors maintenant, il est clair que notre classe Job utilise le trait IlluminateBusQueueable, nous devons donc appeler cette méthode onQueue() sur la classe Job.

$job = new XXXJob();
dispatch($job->onQueue('queue-name'));

Quand on ouvre la file d'attente :

php artisan queue:work --queue=emails

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

相关推荐:

学习Laravel5的Eloquent 关系

laravel5.5控制器传参顺序问题及解决方案

Laravel 5.5的可相应接口如何使用?

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