Blog ENI : Toute la veille numérique !
Dernière chance (fin le 29/02) : -25€ dès 75€ sur les livres en ligne, vidéos... code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Laravel
  3. Les files d'attente
Extrait - Laravel Un framework efficace pour développer vos applications PHP (2e édition)
Extraits du livre
Laravel Un framework efficace pour développer vos applications PHP (2e édition) Revenir à la page d'achat du livre

Les files d'attente

Pourquoi utiliser des files d’attente ?

Certains traitements demandent du temps pour s’exécuter. C’est le cas par exemple d’un envoi d’e-mail, d’un appel à un service web, ou lorsqu’un visiteur envoie sa photo sur un site, pour ensuite la redimensionner et la convertir avant son stockage. Ou encore quand un administrateur demande à l’application la génération d’un rapport PDF avec des graphiques sur un ensemble de données.

Ce type de traitement, qui peut prendre parfois plusieurs secondes, ne doit pas être effectué de manière synchrone sous peine de dégrader l’expérience utilisateur. Un visiteur ne s’attend pas à devoir attendre quatre secondes lors de la création de son compte, simplement parce que l’application est en train d’envoyer un e-mail de bienvenue, dont il ne soupçonne pas l’existence.

Les files d’attente de Laravel (queues) sont utilisées pour garantir une navigation fluide en fournissant un système permettant de déléguer une partie des traitements à un processus séparé. Ainsi, quelle que soit la lourdeur d’une tâche, son exécution n’affectera pas l’expérience du visiteur car elle sera traitée à part.

Ce chapitre n’est qu’une brève introduction au sujet...

Configuration

1. Pilote

Le gestionnaire de file d’attente de Laravel supporte différents pilotes : Redis, Beanstalkd, Amazon SQS, ou la base de données. Il existe également un pilote synchrone qui permet de lancer les tâches directement sans passer par la file d’attente. Ce dernier pilote enlève donc tout intérêt au système de file d’attente, mais se révélera pratique en local pour éviter d’avoir à installer un système de gestion des files d’attente, de le paramétrer et de lancer un programme pour écouter les tâches, mais aussi pour éviter d’attendre la fin de traitement d’une tâche dans la file d’attente.

Pour configurer un pilote de gestion des files d’attente, il faut éditer le fichier .env et indiquer le nom du pilote face à la clé QUEUE_DRIVER. Par défaut, Laravel utilise sync, ce qui est un choix raisonnable pour le développement en local, comme vu précédemment. En production, il est préférable d’utiliser Redis ou n’importe quel autre pilote asynchrone en fonction de vos préférences. Pour que les tâches soient effectivement exécutées, il faudra en outre lancer en tâche de fond le Queue Worker.

Commandes à exécuter pour l’installation du driver « database »...

Créer et expédier des tâches

1. Créer une tâche

Une tâche (ou job en anglais) est un morceau de code qui va s’exécuter en arrière-plan et de manière asynchrone grâce au Queue Worker mis en place précédemment. Elle réalise des traitements longs, comme par exemple ceux décrits en début de chapitre : appel d’un service web, envoi d’un e-mail ou redimensionnement d’une image. Chaque tâche représente une action indépendante. Elle peut mettre le temps nécessaire à s’exécuter, elle ne pénalisera pas la navigation en raison de sa nature asynchrone.

Les tâches prévues pour être mises en file d’attente sont stockées par défaut dans le dossier app/Jobs. Pour créer une tâche, la méthode la plus simple est d’utiliser Artisan en indiquant le nom de la classe à créer.

Création d’une tâche de redimensionnement d’image

sail artisan make:job ResizeImage  

La classe générée implémente l’interface Illuminate\Contracts\Queue \ShouldQueue, ce qui indique à Laravel que la tâche doit être envoyée dans la file d’attente pour être lancée de manière asynchrone avec le Queue Worker.

Contrairement aux autres classes créées dans Laravel qui décrivent des objets avec des noms communs plus ou moins détaillés (Product, ShoppingCart, UserController), on préférera par convention nommer les classes de tâches...

Monitoring

Le traitement d’une file d’attente est un traitement en tâche de fond, c’est-à-dire asynchrone. Cela signifie donc qu’au contraire d’une action synchrone (directement dans un contrôleur par exemple), il est difficile de savoir si tout s’est bien passé : le programme ne s’arrête pas en affichant une erreur dans le navigateur, car l’application web ne sait pas ce qu’il se passe en arrière-plan dans la file d’attente.

1. Traitement des erreurs

Il arrive parfois qu’une tâche rencontre une erreur pendant son traitement. Par exemple, si lors de la création d’un compte, une application Laravel appelle l’API de Zendesk pour créer un compte client, il est possible que l’API ne réponde pas. Cela peut être dû à un problème réseau ou à un problème du côté du service tiers, qui met trop de temps à répondre ou qui est actuellement indisponible. 

Comme vu précédemment, il est possible d’indiquer au Queue Worker qu’il doit tenter d’exécuter plusieurs fois une tâche si elle a rencontré un problème grâce à l’option --tries.

Queue Worker avec cinq essais en cas d’échec

sail artisan queue:work --tries=5  

Il sera ensuite intéressant d’accéder...