Skip to main content

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 in config/queue.php. Cambia driver con QUEUE_CONNECTION.

.env

Preparazione del driver database

Serve una tabella jobs. In Laravel 11+ è già inclusa nella migration. Altrimenti:

Preparazione del driver Redis

Aggiungi la connessione in config/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.
  • enabled attivo: payload > 1MB salvati nel cache store.
  • always a true: salva sempre nel cache store.
  • delete_after_processing (default true): elimina i payload salvati al successo.
  • flush_on_clear a true: queue:clear esegue flush dello store di overflow. Usa uno store dedicato.

Creazione della classe job

make:job

Genera app/Jobs/SendWelcomeEmail.php.

Struttura del job

ShouldQueue indica che va elaborato via coda. Il trait Queueable fornisce i metodi necessari.
Passando un modello Eloquent al costruttore, Laravel serializza solo l’ID e ricarica i dati aggiornati in fase di esecuzione: payload più leggeri.

Dispatch del job

dispatch()

Ritardato

dispatchAfterResponse()

Esegui subito dopo la risposta HTTP. Funziona anche con sync.

Coda specifica

Queue Routing

Instrada per default certi job a una connessione/coda tramite Queue::route() nel boot() di un ServiceProvider.
Puoi indicare interfacce, trait o classi genitore. Più job insieme:
Il Queue Routing è sovrascrivibile a livello di job con onQueue() / onConnection().

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).

Elaborazione dei job

queue:work

Con driver/coda specifici:
queue:work resta in esecuzione. Riavvia con queue:restart dopo modifiche. In produzione usa Supervisor.

Opzioni del worker

Impostazioni nella classe

Rilascio del job (middleware Release)

Per rimettere il job in coda al soddisfacimento di una condizione.
Release::unless() rilascia quando la condizione è false.
Con closure:
Rilasciare incrementa il contatore dei tentativi. Configura correttamente #[Tries] o $tries.

Gestione dei job falliti

Tabella failed_jobs

Cleanup al fallimento

Interrompere il retry per certe eccezioni

In withExceptions() di bootstrap/app.php:
Con closure:
Per eccezioni deterministiche (validazione, sottoscrizione scaduta) è efficiente fallire subito.

Elenco job falliti

Retry

Eliminazione

Driver più usati

database

Semplice, senza middleware aggiuntivi. Salva su jobs 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
In produzione considera Laravel Horizon per monitorare in tempo reale.

Esercizio in produzione con Supervisor

In produzione serve un supervisor che riavvii queue: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

  • Invio email/SMS
  • Elaborazione immagini/video
  • Chiamate ad API esterne
  • Generazione report o export CSV
  • Invio webhook
Con QUEUE_CONNECTION=sync i job vengono eseguiti subito senza worker.
Ultima modifica il 13 luglio 2026