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
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');
É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();
Utilisez la méthode suivante dans Lumen :
dispatch(new Demo);
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
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
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
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);
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); }
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');
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'));
当我们在开启队列的时候:
php artisan queue:work --queue=emails
这里指定的队列名 emails 和 dispatch 时指定的队列名保持一致即可。
总结
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!