Cos’è la concorrenza
Se esegui in sequenza più operazioni indipendenti (chiamate ad API esterne, aggregazioni DB, ecc.), il tempo totale è la somma di ciascuna. Eseguendole in parallelo il tempo totale si riduce al tempo dell’operazione più lenta. La facadeConcurrency di Laravel realizza questo con un’API semplice.
La facade
Concurrency è stata introdotta in Laravel 11 ed è disponibile anche in Laravel 13. Il driver predefinito usa processi PHP figli e non richiede pacchetti aggiuntivi.Come funziona
La facadeConcurrency serializza le closure passate, le invia a un comando Artisan nascosto e le esegue come processi PHP separati.
Al termine i valori di ritorno vengono serializzati e restituiti al processo genitore.
Sono disponibili tre driver:
| Driver | Descrizione |
|---|---|
process | Predefinito. Avvia processi PHP figli. Funziona anche nelle richieste web. |
fork | Richiede il pacchetto spatie/fork. Fork del processo: solo CLI ma più veloce. |
sync | Nessun parallelismo, esecuzione sequenziale. Utile per i test. |
Uso di base
Concurrency::run()
Passa arun() un array di closure: verranno eseguite in parallelo.
Ottieni i risultati come array nello stesso ordine delle closure.
Scegliere il driver
Condriver() specifichi un driver.
default.
Driver fork
fork è più veloce di process ma disponibile solo in CLI (Artisan, queue worker).
Non funziona nelle richieste web.
Prima installa spatie/fork.
Senza risultati: Concurrency::defer()
Se non ti interessa il risultato e vuoi eseguire dopo l’invio della risposta HTTP, usadefer().
Esempio pratico: chiamare più API in parallelo
Dashboard di e-commerce che consulta tre API (inventario, vendite, spedizioni).Sequenziale (prima)
Parallela (dopo)
Aggregazioni DB in parallelo
Nei test
Usasync per esecuzione sequenziale, evitando l’overhead dei processi.
.env.testing:
Note
Limitazioni delle closure
Limitazioni delle closure
Le closure vengono serializzate. Non catturare oggetti non serializzabili (connessioni DB, file handle) da fuori: costruiscili dentro la closure.
Overhead di process
Overhead di process
process ha un costo di avvio dei figli: per operazioni molto brevi (< pochi ms) potresti non guadagnare. Utile per operazioni > 100ms.Limitazioni di fork
Limitazioni di fork
Non funziona in FPM/Apache, solo in Artisan e worker.
Eccezioni
Eccezioni
Se in parallelo viene sollevata un’eccezione,
run() la rilancia. Per continuare, gestiscila dentro ciascuna closure con try/catch.Prossimi passi
Code e job
Impara code e job per l’esecuzione asincrona in background.