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.
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 :
Driver
Description
process
Par défaut. Sous-processus PHP. Fonctionne en Web
fork
Nécessite spatie/fork. Uniquement en CLI, plus rapide
use Illuminate\Support\Facades\Http;public function dashboard(): array{ // Chaque requête attend la précédente (~3 s au total) $inventory = Http::get('https://api.example.com/inventory')->json(); $sales = Http::get('https://api.example.com/sales')->json(); $shipping = Http::get('https://api.example.com/shipping')->json(); return compact('inventory', 'sales', 'shipping');}
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.
// NG : capture un modèle Eloquent$user = User::find(1);Concurrency::run([ fn () => $user->orders()->count(), // Peut ne pas être sérialisable]);// OK : reconstruit à l'intérieur$userId = 1;Concurrency::run([ fn () => Order::where('user_id', $userId)->count(),]);
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`
fork clone le processus PHP : impossible en web (FPM, Apache).
Utilisez-le en Artisan / worker.
Gestion des exceptions
Toute exception se propage via run(). Pour laisser les autres closures s’exécuter, gérez try/catch dans chaque closure.