Dans le développement de Laravel, la file d'attente des tâches est un composant très important, qui nous permet d'effectuer certaines opérations fastidieuses de manière asynchrone sans affecter l'expérience utilisateur. La file d'attente des tâches dans Laravel est divisée en deux parties : la distribution des tâches et l'exécution des tâches. Bien que la répartition des tâches devrait être très simple en théorie, nous rencontrons parfois des problèmes, tels que l'échec de la répartition des tâches. Que devons-nous faire à ce moment-là ?
Tout d'abord, nous devons déterminer si la répartition des tâches est réussie. La distribution des tâches de Laravel est implémentée via des files d'attente. Nous pouvons déterminer si la tâche a été distribuée en vérifiant l'état de la file d'attente. Laravel fournit une commande pour vérifier l'état de la file d'attente. Vous pouvez saisir la commande suivante dans le terminal :
php artisan queue:work --status
Après l'exécution, nous pouvons voir un résultat similaire à celui-ci :
Status check starting... The "database" queue has 0 jobs processing. The "redis" queue is not available. Written jobs: - Job 123 on connection "database" - Job 456 on connection "redis" - Job 789 on connection "redis" ...
Cette commande affichera l'état de toutes les files d'attente, y compris les tâches de traitement et les tâches en attente de traitement. Ce que nous devons noter, c'est que dans Laravel, les tâches ne sont pas exécutées immédiatement, mais doivent attendre que l'exécuteur de la tâche (travailleur) dans la file d'attente soit traité. Par conséquent, même si la tâche a été distribuée avec succès dans la file d'attente, nous devons attendre un moment pour la voir être traitée.
Donc, si nous avons déterminé que la répartition des tâches est réussie, mais que la tâche n'est toujours pas exécutée, que devons-nous faire à ce moment-là ? Voici quelques solutions possibles :
Laravel prend en charge de nombreux pilotes de file d'attente différents, notamment Redis, MySQL, Beanstalkd, etc. Si vous utilisez Redis ou MySQL comme pilote de file d'attente, vous devez vous assurer qu'ils sont correctement configurés et fonctionnent correctement.
Plus précisément, nous devons vérifier la section file d'attente dans le fichier de configuration de Laravel :
'connections' => [ 'sync' => [ 'driver' => 'sync', ], 'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'retry_after' => 90, ], 'beanstalkd' => [ 'driver' => 'beanstalkd', 'host' => 'localhost', 'queue' => 'default', 'retry_after' => 90, 'block_for' => 0, ], 'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, 'block_for' => null, ], ], 'default' => env('QUEUE_CONNECTION', 'sync'),
Dans ce fichier de configuration, nous devons nous assurer que les informations de connexion et les informations de file d'attente ont été configurées correctement. Si elle n'est pas configurée correctement, la file d'attente des tâches ne fonctionnera pas.
Si la file d'attente a été configurée correctement et que la tâche n'est toujours pas en cours d'exécution, nous devons alors vérifier s'il y a un problème avec les tâches dans la file d'attente. Plus précisément, nous devons vérifier si la classe de tâches a été définie, si la méthode de tâche a été implémentée et si les paramètres de tâche ont été transmis correctement.
Ce qui suit est une définition simple de classe de tâches :
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class SendEmail implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() { // } }
Dans cette classe de tâches, nous définissons une tâche SendEmail, qui implémente l'interface ShouldQueue et définit une méthode handle(), qui sera exécutée lorsque la tâche est appelée. . Si la classe de tâches a été définie correctement, mais que la tâche n'est toujours pas exécutée, nous devons alors vérifier s'il y a un problème avec le code dans la méthode handle().
S'il n'y a aucun problème avec la file d'attente et la tâche, il se peut qu'il y ait un problème avec l'exécuteur de tâches. L'exécuteur de tâches dans Laravel est démarré via la commande queue:work. Nous pouvons entrer la commande suivante dans le terminal pour démarrer l'exécuteur de tâches :
php artisan queue:work
Si l'exécuteur de tâches ne fonctionne pas normalement, nous devons alors vérifier le fichier journal pour voir s'il y a des messages d'erreur associés. Les fichiers journaux de Laravel sont stockés par défaut dans le répertoire storage/logs. Nous pouvons ouvrir le dernier fichier journal pour le visualiser.
Si aucune des solutions ci-dessus ne fonctionne, nous pouvons essayer d'utiliser d'autres pilotes de tâches de file d'attente pour voir si le problème peut être résolu. Par exemple, si Redis a déjà été utilisé comme pilote de tâche de file d'attente, nous pouvons essayer d'utiliser MySQL ou Beanstalkd à la place.
Dans Laravel, nous pouvons facilement changer le pilote de tâche de file d'attente. Modifiez simplement les informations du pilote de file d'attente dans le fichier de configuration Laravel.
Pour résumer, lorsque nous rencontrons le problème de l'échec de la file d'attente Laravel, nous devons d'abord déterminer si la tâche a été distribuée avec succès dans la file d'attente, puis résoudre progressivement les problèmes dans le pilote de file d'attente, la tâche de file d'attente, l'exécuteur de tâches, etc. jusqu'à ce qu'une solution soit trouvée.
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!