Cosa sono le code
Nelle applicazioni web puoi avere operazioni che richiedono qualche secondo: invio email, ridimensionamento immagini, chiamate ad API esterne. Eseguirle sincronamente in una richiesta HTTP costringe l’utente ad aspettare. Con le code di Laravel esegui questi lavori in background in modo asincrono. La richiesta risponde subito e i worker si occupano del lavoro.Le code supportano più backend: database, Redis, Amazon SQS, ecc.
In sviluppo, con il driver
sync i job vengono eseguiti immediatamente senza coda.Configurazione delle code
config/queue.php
Impostazioni inconfig/queue.php. Cambia driver con QUEUE_CONNECTION.
.env
Preparazione del driver database
Serve una tabellajobs. In Laravel 11+ è già inclusa nella migration.
Altrimenti:
Preparazione del driver Redis
Aggiungi la connessione inconfig/database.php e installa il driver.
SQS Overflow Storage
Amazon SQS ha un limite sulla dimensione dei payload. Per job con payload grandi puoi salvare l’eccesso in un cache store e inviare solo un puntatore.enabledattivo: payload > 1MB salvati nel cache store.alwaysatrue: salva sempre nel cache store.delete_after_processing(defaulttrue): elimina i payload salvati al successo.flush_on_clearatrue:queue:clearesegueflushdello store di overflow. Usa uno store dedicato.
Creazione della classe job
make:job
app/Jobs/SendWelcomeEmail.php.
Struttura del job
ShouldQueue indica che va elaborato via coda. Il trait Queueable fornisce i metodi necessari.
Dispatch del job
dispatch()
Ritardato
dispatchAfterResponse()
Esegui subito dopo la risposta HTTP. Funziona anche consync.
Coda specifica
Queue Routing
Instrada per default certi job a una connessione/coda tramiteQueue::route() nel boot() di un ServiceProvider.
Il Queue Routing è sovrascrivibile a livello di job con
onQueue() / onConnection().Inoltro delle code (Queue::forward())
Con Queue::forward() puoi inoltrare i job da una coda a un’altra coda o connessione. È utile quando vuoi cambiare l’infrastruttura delle code senza modificare i singoli job o il codice chiamante.
Se il job specifica esplicitamente una connessione, quella indicazione ha la precedenza sulla configurazione di inoltro.
Esecuzione sincrona (test/sviluppo)
Dispatch in bulk
Per molti job indipendenti senza tracciamento come nei batch:Bus::bulk() invia in modo efficiente ma senza le funzionalità di batch (progresso, callback).Catene di job
Concatenando i job puoi eseguire più job in sequenza. Se un job della catena fallisce, i job successivi non vengono eseguiti.Batch di job
I batch permettono di dispatchare più job insieme e tracciarne il progresso complessivo. Per prima cosa crea la migration per la tabellajob_batches.
Batchable nella classe del job.
Bus::batch() puoi dispatchare il batch e registrare callback per completamento, fallimento e fine dell’esecuzione.
Elaborazione dei job
queue:work
Opzioni del worker
Impostazioni nella classe
Contare i crash come eccezioni
Per impostazione predefinita, i tentativi che terminano perché il processo worker va in crash o viene terminato forzatamente, ad esempio per memoria insufficiente, non vengono conteggiati nel numero massimo di eccezioni del job (MaxExceptions). Se vuoi che anche questi tentativi vengano conteggiati come eccezioni, aggiungi l’attributo CountCrashesAsExceptions alla classe del job.
Controllo dell’esecuzione con i middleware dei job
I middleware dei job permettono di isolare logiche trasversali, come la limitazione della frequenza o la prevenzione di esecuzioni concorrenti, dal metodohandle(), dichiarandole in modo esplicito nel metodo middleware(). Poiché la logica non viene scritta all’interno del job, lo stesso controllo può essere riutilizzato facilmente in più job.
Limitazione della frequenza (RateLimited)
Definisci una limitazione tramite il metodofor della facade RateLimiter e applica il middleware Illuminate\Queue\Middleware\RateLimited al job.
releaseAfter() puoi fissare i secondi prima del nuovo tentativo, oppure con dontRelease() far terminare il job senza rimetterlo in coda.
Illuminate\Queue\Middleware\RateLimitedWithRedis, che offre prestazioni migliori.
Prevenzione delle esecuzioni concorrenti (WithoutOverlapping)
Illuminate\Queue\Middleware\WithoutOverlapping impedisce che più istanze dello stesso job vengano eseguite contemporaneamente sulla base di una chiave arbitraria. È utile quando vuoi aggiornare una determinata risorsa un elemento alla volta.
releaseAfter() puoi indicare l’intervallo prima del nuovo tentativo, mentre con dontRelease() puoi eliminarli subito. Poiché il lock si basa sul meccanismo dei lock atomici, è consigliabile specificare esplicitamente la scadenza con expireAfter(), così il lock non resta bloccato in caso di errore o timeout imprevisto del job.
Per impostazione predefinita la prevenzione dei duplicati avviene solo all’interno della stessa classe job. Se vuoi condividere la chiave di lock tra classi job differenti, usa il metodo
shared().Contenimento delle eccezioni consecutive (ThrottlesExceptions)
Illuminate\Queue\Middleware\ThrottlesExceptions è pensato per i job che interagiscono con servizi instabili, come API esterne: quando si verificano un certo numero di eccezioni, sospende temporaneamente le esecuzioni successive. Si usa tipicamente in combinazione con un limite di tentativi basato sul tempo (retryUntil()).
when() puoi limitare il throttling a specifiche eccezioni, oppure con deleteWhen() puoi eliminare il job quando si verifica una certa eccezione, ottenendo un controllo più preciso.
Illuminate\Queue\Middleware\ThrottlesExceptionsWithRedis permette di gestire il throttling in modo più efficiente.
Rilascio del job (middleware Release)
Per rimettere il job in coda al soddisfacimento di una condizione.Release::unless() rilascia quando la condizione è false.
Gestione dei job falliti
Tabella failed_jobs
Cleanup al fallimento
Interrompere il retry per certe eccezioni
InwithExceptions() di bootstrap/app.php:
Elenco job falliti
Retry
Eliminazione
Driver più usati
database
Semplice, senza middleware aggiuntivi. Salva sujobs e i worker fanno polling.
- Pro: setup semplice, riusa RDBMS
- Contro: carico DB, non adatto a grandi volumi
redis
Il più usato in produzione. In memoria, alta throughput.- Pro: veloce, scalabile
- Contro: richiede server Redis
Esercizio in produzione con Supervisor
In produzione serve un supervisor che riavviiqueue:work se cade.
numprocs=2 per due worker in parallelo.
Esempio pratico: invio email in coda
1
Crea il job
2
Implementa
3
Dispatch dal controller
4
Avvia il worker
Riepilogo
Quando usare le code
Quando usare le code
- Invio email/SMS
- Elaborazione immagini/video
- Chiamate ad API esterne
- Generazione report o export CSV
- Invio webhook
Suggerimenti in sviluppo
Suggerimenti in sviluppo
Con
QUEUE_CONNECTION=sync i job vengono eseguiti subito senza worker.Comandi comuni
Comandi comuni