Skip to main content

Qu’est-ce qu’une queue

Dans une application web, l’envoi de mails, le redimensionnement d’images ou les appels d’API externes peuvent prendre plusieurs secondes. Traiter cela de manière synchrone dans une requête HTTP fait attendre l’utilisateur inutilement. Les queues Laravel exécutent ces tâches en arrière-plan : la requête retourne immédiatement une réponse, et un worker traite le job à part.
Backends supportés : base de données, Redis, Amazon SQS… En dev, le driver sync exécute les jobs immédiatement, sans queue.

Configuration

config/queue.php

.env

Préparer le driver database

database nécessite une table jobs. Sous Laravel 11+, la migration est incluse ; sinon :

Préparer le driver Redis

Configurez la connexion Redis dans config/database.php puis installez :

Overflow storage SQS

Amazon SQS limite la taille de payload. Pour de gros payloads, redirigez l’excédent vers un cache et n’envoyez qu’un pointeur.
  • enabled : payloads ≥ 1 Mo → cache.
  • always: true : toujours passer par le cache.
  • delete_after_processing : nettoie le cache après succès (true par défaut).
  • flush_on_clear: true : queue:clear purge le cache d’overflow. À combiner avec un store dédié pour ne pas vider le cache général.

Créer une classe de job

Commande make:job

Le fichier app/Jobs/SendWelcomeEmail.php est créé.

Structure

ShouldQueue indique un traitement asynchrone. Le trait Queueable fournit les méthodes nécessaires.
Passer un modèle Eloquent au constructeur sérialise seulement son ID. Au moment de l’exécution, le modèle est récupéré à jour : payload allégé.

Dispatch

dispatch()

Dispatch différé

dispatchAfterResponse()

Exécute le job après l’envoi de la réponse HTTP. Fonctionne aussi en sync — idéal pour du léger sans worker.

Vers une queue précise

Routing de queue

Pour rediriger par défaut certaines classes vers une connexion/queue précise, utilisez Queue::route() dans boot().
Ciblez interface, trait, classe parente… tout ce qui les implémente/étend est routé. Plusieurs routes en une :
Un onQueue() / onConnection() explicite sur le job prime sur le routing.

Sync (dev/tests)

dispatchSync() exécute immédiatement, sans queue.

Bulk dispatch

Pour envoyer beaucoup de jobs indépendants d’un coup sans tracking : Bus::bulk().
Bus::bulk() groupe les jobs par connexion/queue et les envoie par lot. Contrairement à Bus::batch(), pas de suivi ni de callback.

Traiter les jobs

queue:work

Ciblez driver et file :
queue:work reste actif. Après un changement de code, queue:restart recharge les workers. En production, un superviseur (Supervisor…) est recommandé.

Options de supervision

Retry paramétré côté job

Souvent plus lisible que la CLI.

Libération de job (middleware Release)

Pour renvoyer le job dans la queue sans l’exécuter, sous condition, utilisez le middleware Release.
Release::unless() libère si la condition est false.
Une closure pour des cas plus complexes :
Chaque libération incrémente le compteur d’essais. Réglez #[Tries] ou $tries en conséquence.

Jobs échoués

Table failed_jobs

Après épuisement des tentatives, le job est stocké dans failed_jobs.

Cleanup à l’échec

Définissez failed() sur le job.

Arrêter les retries par type d’exception

Utilisez dontRetry dans withExceptions() (fichier bootstrap/app.php).
Avec une closure pour un contrôle fin :
Idéal pour des cas où retenter ne changera rien (validation, échec de paiement, abonnement expiré…).

Lister les échecs

Retry

Suppression

Drivers courants

database

Simple à mettre en place, utilise la RDBMS existante.
  • Avantages : setup rapide, sans dépendance
  • Inconvénients : lourd pour de gros volumes

redis

Driver rapide, très utilisé en production. Débit supérieur.
  • Avantages : rapide, scalable
  • Inconvénients : nécessite Redis
En production, Laravel Horizon offre un beau dashboard pour surveiller les jobs Redis en temps réel.

Supervisor en production

Sous Linux, faites tourner queue:work en continu avec Supervisor.
numprocs=2 démarre 2 workers en parallèle. Rechargez Supervisor :

Exemple : envoi d’e-mail en queue

1

Créer le job

2

Implémenter

3

Dispatcher depuis un contrôleur

4

Démarrer un worker

Récapitulatif

  • Envoi de mails / SMS
  • Redimensionnement d’images / vidéos
  • Appels d’API externes
  • Génération de rapports / exports CSV
  • Envoi de webhooks
QUEUE_CONNECTION=sync dans .env exécute immédiatement — pas besoin de worker pour tester.
Dernière modification le 13 juillet 2026