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çadeConcurrency 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.
Choisir un driver
Avecdriver() :
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.
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().
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)
Plusieurs agrégations DB en parallèle
Configuration pour les tests
Le driversync exécute séquentiellement — pas de coût de sous-processus, tests plus rapides.
.env.testing :
Précautions
Limitations des closures
Limitations des closures
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.
Overhead de `process`
Overhead de `process`
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).
Limite de `fork`
Limite de `fork`
fork clone le processus PHP : impossible en web (FPM, Apache).
Utilisez-le en Artisan / worker.Gestion des exceptions
Gestion des exceptions
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.