Laravel 12.34 a introduit l’une des fonctionnalités les plus attendues de l’année : les Deferred Batches, tant pour les requêtes HTTP que pour les files d’attente. Derrière ce nom technique se cache une révolution dans la gestion des tâches asynchrones lourdes : exécuter des dizaines, voire des centaines de requêtes ou de jobs sans bloquer l’utilisateur, avec un suivi précis des progrès, des succès et des échecs.
Cette nouveauté, portée par Wendell Adriel et validée par Taylor Otwell, est déjà saluée comme "le meilleur ajout à Laravel depuis les queues" par la communauté sur X. Plongeons dans les détails techniques, avec un exemple complet et une explication pas à pas.
Qu’est-ce que les Deferred Batches ?
Un Deferred Batch est un lot de tâches (HTTP ou jobs) qui :
- S’exécute en arrière-plan (via une file d’attente),
- Ne bloque jamais la réponse HTTP principale,
- Permet de suivre en temps réel :
- Le nombre de tâches terminées,
- Les échecs,
- La progression globale,
- Offre des callbacks personnalisés sur
then,catch,finally.
Avant : Vous deviez gérer manuellement les jobs, les progress bars, les retries…
Maintenant : Laravel fait tout ça en une seule méthode.
1. Http::batch() – Des Requêtes HTTP en Lot, Différées
Cas d’usage classique
Vous devez appeler 50 API externes (Stripe, GitHub, CRM, etc.) pour synchroniser des données utilisateur.
Problème : 50 appels synchrones = 10+ secondes de latence → timeout ou UX dégradée.
Solution : Http::batch() + file d’attente.
Exemple Complet
use Illuminate\Support\Facades\Http;use Illuminate\Bus\Batch;use Illuminate\Support\Facades\Bus; // Dans un contrôleur ou un jobpublic function syncExternalApis(){ $batch = Http::batch([ // ... 47 autres requêtes ])->dispatch(); // ← Différé dans la queue ! // Sauvegarder l'ID du batch pour suivi session()->put('sync_batch_id', $batch->id); return redirect()->route('sync.status') ->with('message', 'Synchronisation lancée en arrière-plan...');}
Suivi de la progression (dans une vue ou API)
// routes/web.phpRoute::get('/sync/status', function () { $batchId = session('sync_batch_id'); $batch = Bus::findBatch($batchId); if ($batch->finished()) { return "Terminé ! {$batch->processedRequests()} / {$batch->totalRequests} réussies."; } return "En cours... {$batch->processedPercentage()}%";});
Callbacks Puissants
Http::batch([...]) ->then(function (Batch $batch) { // Toutes les requêtes ont réussi Log::info('Sync complet !', ['processed' => $batch->processedRequests()]); }) ->catch(function (Batch $batch, Throwable $e) { // Au moins une a échoué Notification::send(Admin::all(), new SyncFailed($batch)); }) ->finally(function (Batch $batch) { // Nettoyage, envoi d'email, etc. cache()->forget('sync_in_progress'); }) ->dispatch();
2. Deferred Queues – Jobs Différés en Batch
Même principe, mais pour n’importe quel job Laravel.
Exemple : Traitement de 1000 PDFs
use Illuminate\Support\Facades\Bus;use App\Jobs\GeneratePdfReport; $batch = Bus::batch([ new GeneratePdfReport($user1), new GeneratePdfReport($user2), // ... 998 autres])->then(function (Batch $batch) { // Tous les PDFs sont générés})->catch(function (Batch $batch, Throwable $e) { // Un job a échoué → retry ou alerte retryFailedJobs($batch);})->dispatch();
Priorité et Délai
Bus::batch([...]) ->priority(10) // Priorité dans la queue ->delay(now()->addMinutes(5)) // Démarrer dans 5 min ->dispatch();
Fonctionnalités Clés des Deferred Batches
| Fonctionnalité | Description |
|---|---|
dispatch() |
Envoie le batch dans la queue (asynchrone) |
then(), catch(), finally() |
Callbacks sur succès/échec/complétion |
progress() |
Pourcentage en temps réel |
allowFailures() |
Continue même si une tâche échoue |
name('Sync Users') |
Nom pour debugging dans Horizon |
onQueue('high') |
File d’attente dédiée |
Intégration avec Laravel Horizon (Dashboard)
Dans Horizon, vous verrez :
- Un onglet Batches,
- Progression en temps réel,
- Boutons Retry, Cancel, Delete,
- Graphiques de performance.
php artisan horizon
Pourquoi c’est une Révolution ?
| Avant (Laravel 11) | Après (Laravel 12.34) |
|---|---|
Http::pool() → synchrone ou limité |
Http::batch() → 100+ appels asynchrones |
| Jobs manuels + progress bars custom | Batch natif avec callbacks |
| Pas de suivi centralisé | Horizon + Bus::findBatch() |
| Risque de timeout | Zéro impact sur la réponse HTTP |
Mise à Jour & Compatibilité
composer require laravel/framework:^12.34
Aucun breaking change. Fonctionne avec Redis, SQS, Database, Beanstalkd.
Assurez-vous que votre driver de queue supporte les batches (tous les drivers officiels le font).
Use Cases Réels
- Synchronisation CRM → 500 appels API → 3 secondes au lieu de 45.
- Génération de rapports mensuels → 10 000 jobs → suivi en dashboard.
- Import CSV massif → chunk par chunk, avec progression live.
- Webhooks en masse → retry automatique sur échec.
Conclusion
Avec Deferred Batches, Laravel 12.34 transforme une tâche complexe (gérer des centaines d’opérations asynchrones) en quelques lignes de code élégantes.
Taylor Otwell sur X :
"Deferred HTTP Batches & Queues – this is the cool stuff that shipped in the last two weeks."
→ 600+ likes, 120 retweets.
À vous de jouer : testez Http::batch()->dispatch() dans votre prochain projet. Votre utilisateur ne verra plus jamais une page qui charge…
Liens utiles :
WAFFO LELE ROSTAND