Skip to main content

Qu’est-ce que la concurrence

Exécuter séquentiellement plusieurs traitements indépendants (appels d’API externes, agrégations DB…) additionne les durées. En les exécutant en parallèle, la durée totale se réduit à celle du plus long. La façade Concurrency de Laravel fournit une API simple pour cela.
Introduite avec Laravel 11, elle reste disponible sous Laravel 13. Le driver par défaut utilise des sous-processus PHP, sans package additionnel.

Fonctionnement

Concurrency sérialise chaque closure et l’envoie à une commande Artisan interne exécutée dans un processus séparé. Les valeurs de retour sont sérialisées et renvoyées au processus parent. Trois drivers :

Utilisation

Concurrency::run()

Passez un tableau de closures. Elles s’exécutent en parallèle, et vous récupérez leurs retours dans le même ordre.
Destructuration du tableau pour affecter chaque résultat.

Choisir un driver

Avec driver() :
Pour changer le driver par défaut, publiez la configuration.

Utiliser le driver fork

Plus rapide que process, mais uniquement en environnement CLI (Artisan, workers). Non utilisable dans une requête web. Installez spatie/fork d’abord.
fork ne fonctionne pas dans une requête web. Utilisez-le dans une commande Artisan ou un worker de queue.

Ignorer les résultats : Concurrency::defer()

Si les résultats n’importent pas et que le traitement peut s’exécuter après la réponse HTTP, utilisez defer().
L’exécution démarre après l’envoi de la réponse, en parallèle.
Idéal pour les métriques, les warmups de cache, etc., quand l’utilisateur n’a pas à attendre.

Exemple : appeler plusieurs API en parallèle

Dashboard e-commerce interrogeant l’inventaire, les ventes et l’expédition.

Séquentiel (avant)

Parallèle (après)

Si chaque API met 1 s : ~3 s en séquentiel, ~1 s en parallèle.

Plusieurs agrégations DB en parallèle

Chaque sous-processus ouvre sa propre connexion DB. Attention au nombre max de connexions concurrentes.

Configuration pour les tests

Le driver sync exécute séquentiellement — pas de coût de sous-processus, tests plus rapides.
Ou dans .env.testing :

Précautions

Les closures sont sérialisées puis passées au sous-processus. Vous ne pouvez pas capturer d’objets non sérialisables (connexions DB, ressources). Recréez les objets nécessaires à l’intérieur de la closure.
Le démarrage des sous-processus a un coût. Pour des traitements très rapides (< qq ms), la parallélisation peut être plus lente. Elle est efficace pour des tâches > 100 ms (HTTP, agrégations).
fork clone le processus PHP : impossible en web (FPM, Apache). Utilisez-le en Artisan / worker.
Toute exception se propage via run(). Pour laisser les autres closures s’exécuter, gérez try/catch dans chaque closure.

Prochaines étapes

Files d'attente et jobs

Découvrez comment exécuter des traitements en arrière-plan.
Dernière modification le 13 juillet 2026

Sujets connexes

ConcurrenceClient HTTP