Skip to main content

Cos’è Horizon

Laravel Horizon è una dashboard di monitoraggio dedicata alle code Redis di Laravel. Visualizza in tempo reale throughput, tempi di esecuzione e job falliti, e gestisce la configurazione dei worker come codice.
Horizon è un pacchetto che estende le funzionalità di base delle code. Prima leggi le basi di Code e job. Come backend è sempre necessario Redis.

Installazione

Horizon usa Redis come backend delle code. Verifica che in config/queue.php QUEUE_CONNECTION sia impostato su redis. Al momento non è supportato Redis Cluster.
Installa via Composer.
Dopo l’installazione, pubblica asset e file di configurazione.
Il comando genera config/horizon.php e app/Providers/HorizonServiceProvider.php.

Configurazione

Struttura di config/horizon.php

config/horizon.php gestisce tutta la configurazione dei worker. L’opzione centrale è environments.
Internamente Horizon usa una connessione Redis chiamata horizon. Non usare questo nome per altre connessioni in config/database.php.

CSP nonce (Content Security Policy)

Se, come parte della tua Content Security Policy, vuoi impostare un attributo nonce sui tag script / style delle view di Horizon, usa Horizon::cspNonce. Poiché per ogni richiesta va assegnato un nuovo nonce, di solito lo chiami all’interno di un middleware.
Aggiungi questo middleware all’opzione middleware di config/horizon.php.

Supervisor

Ogni ambiente può avere uno o più “supervisor”. Un supervisor è l’unità di gestione di un gruppo di worker e in uno stesso ambiente possono coesistere più supervisor con code, strategie di bilanciamento e numeri di processi diversi.

Valori di default

Con l’opzione defaults puoi impostare valori applicati a tutti i supervisor.

Modalità manutenzione

Quando l’applicazione è in modalità manutenzione, Horizon di default non processa job. Per forzare l’elaborazione usa l’opzione force.

Numero massimo di tentativi

Impostando tries a 0 consenti retry illimitati.

Timeout dei job

Imposta timeout a qualche secondo in meno rispetto a retry_after di config/queue.php. Inoltre, con la strategia di balancing auto, i job più lunghi di questo valore possono essere forzatamente terminati.

Backoff (attesa prima del retry)

Indica i secondi da attendere prima di un nuovo tentativo dopo un’eccezione.

Altre opzioni dei worker

Oltre a tries, timeout e backoff, ogni supervisor accetta opzioni per controllare il comportamento dei worker e il momento del riavvio automatico. Riavviare periodicamente i processi long-running è una buona prassi per prevenire memory leak.
  • memory — memoria massima (MB) che un worker può consumare prima del riavvio. Default 128.
  • maxJobs — numero di job processati prima del riavvio. 0 significa illimitato. Default 0.
  • maxTime — secondi di attività di un worker prima del riavvio. 0 disabilita il riavvio a tempo. Default 0.
  • sleep — secondi di attesa tra un polling e il successivo quando non ci sono job. Default 3.
  • rest — secondi di pausa tra l’elaborazione di un job e il successivo. Default 0.
  • nice — priorità (“niceness”) del processo. Valori più alti significano priorità più bassa. Default 0.

Strategie di bilanciamento

Horizon offre tre strategie di bilanciamento dei worker.
Adegua automaticamente il numero di worker in base al carico della coda. L’intervallo si imposta con minProcesses e maxProcesses.
  • time — scaling in base al tempo stimato per svuotare la coda
  • size — scaling in base al numero di job in coda
Con la strategia auto l’ordine delle code non indica la priorità. Se ti serve forzare la priorità, usa più supervisor.
Fissa il numero di worker e li distribuisce uniformemente sulle code indicate.
Nell’esempio, 5 processi vengono assegnati a default e 5 a notifications.
Rispetta rigorosamente l’ordine di priorità delle code elencate. Comportamento identico al sistema di code di Laravel di default, ma con scaling del numero di worker in base agli arretrati.
I job della coda default vengono sempre processati prima di quelli di notifications.

Autorizzazione della dashboard

La dashboard di Horizon è accessibile alla route /horizon. In locale è aperta a tutti; in produzione limita l’accesso con una gate. Modifica il metodo gate() in app/Providers/HorizonServiceProvider.php.
Se non usi l’autenticazione (proteggendo per IP ecc.), rendi opzionale l’argomento.

Avvio di Horizon

Comandi principali

Sviluppo locale: riavvio automatico

Per riavviare Horizon automaticamente al variare dei file usa horizon:listen.

Sempre attivo con Supervisor

In produzione mantieni Horizon sempre attivo con Supervisor.

Installazione di Supervisor

File di configurazione

Crea /etc/supervisor/conf.d/horizon.conf.
Imposta stopwaitsecs a un valore maggiore della durata del job più lungo. Se è troppo basso, Supervisor terminerà forzatamente i job in corso.

Avvio di Supervisor

Al deploy

Ad ogni deploy, riavvia Horizon per applicare le modifiche.
Se Supervisor ha autostart=true / autorestart=true, Horizon verrà riavviato automaticamente dopo la terminazione.

Gestione dei job

Tag

Horizon rileva automaticamente i modelli Eloquent legati ai job e aggiunge tag.
Per tag manuali, implementa il metodo tags().
Per gli event listener, l’istanza dell’evento viene passata al metodo tags().

Silenziare i job

I job che non vuoi vedere nella lista “job completati” della dashboard si silenziano da config/horizon.php.
In alternativa puoi implementare l’interfaccia Silenced.

Metriche e monitoring

La dashboard delle metriche di Horizon mostra throughput e tempi di esecuzione di job e code. Per registrare periodicamente uno snapshot, imposta uno schedule.
L’opzione metrics.trim_snapshots di config/horizon.php imposta quanti snapshot conservare per i grafici delle metriche. Poiché la retention è espressa in numero e non in tempo, il periodo effettivo dipende dalla frequenza di horizon:snapshot.
Per eliminare tutte le metriche:

Notifiche di fallimento job

Puoi essere notificato quando i tempi di attesa in coda si allungano. Configura nel metodo boot() di app/Providers/HorizonServiceProvider.php.

Soglie di attesa

L’opzione waits di config/horizon.php imposta la soglia (in secondi) che attiva la notifica.
Impostando 0 disabiliti le notifiche per quella coda.

Gestione dei job falliti

Puoi eliminare i job falliti per ID o UUID.
Per svuotare tutti i job di una coda:

Upgrade

Ad ogni major di Horizon consulta sempre la guida di upgrade.

Pagine correlate

Code e job

Fondamenti delle code Laravel: creazione, dispatch, batch e gestione dei fallimenti.

Redis

Configurazione e uso di Redis, il backend richiesto da Horizon.
Ultima modifica il 2 agosto 2026