Skip to main content

Qu’est-ce que Horizon ?

Laravel Horizon est le tableau de bord de supervision dédié aux queues Redis de Laravel. Il permet de visualiser en temps réel le débit des jobs, leur temps d’exécution et leurs échecs, tout en gérant la configuration des workers par le code.
Horizon est un package qui étend les fonctionnalités de base de la queue. Assurez-vous d’avoir d’abord assimilé les bases de la section Queues et jobs. Le backend Redis est également obligatoire — voir Redis.

Installation

Horizon utilise Redis comme backend de queue. Vérifiez que QUEUE_CONNECTION dans config/queue.php est réglé sur redis. Redis Cluster n’est pas pris en charge à ce jour.
Installez le package avec Composer.
Publiez ensuite les assets et le fichier de configuration.
Cette commande crée config/horizon.php et app/Providers/HorizonServiceProvider.php.

Configuration

Structure de config/horizon.php

Le fichier config/horizon.php centralise toute la configuration des workers. Son cœur est l’option environments.
Horizon utilise en interne une connexion Redis appelée horizon. Ne réutilisez pas ce nom pour une autre connexion dans config/database.php.

CSP nonce (Content Security Policy)

Pour intégrer un attribut nonce sur les balises script / style des vues Horizon dans le cadre d’une Content Security Policy, utilisez la méthode Horizon::cspNonce. Comme il faut un nonce par requête, on l’appelle généralement depuis un middleware.
Ajoutez ce middleware à l’option middleware de config/horizon.php.

Supervisors

Chaque environnement peut contenir un ou plusieurs « supervisors ». Un supervisor est l’unité de gestion d’un groupe de workers ; vous pouvez en faire cohabiter plusieurs dans le même environnement, chacun avec ses propres queues, sa propre stratégie d’équilibrage et son propre nombre de processus.

Valeurs par défaut

L’option defaults permet de définir des valeurs par défaut communes à tous les supervisors.

Mode maintenance

Lorsque l’application est en mode maintenance, Horizon ne traite pas les jobs par défaut. Pour forcer le traitement, utilisez force.

Nombre maximum de tentatives

Une valeur de 0 pour tries autorise un nombre illimité de tentatives.

Timeout des jobs

timeout doit être quelques secondes plus court que retry_after dans config/queue.php. Avec la stratégie auto, un job dont le temps dépasse cette valeur peut être forcé à terminer.

Backoff (délai avant nouvelle tentative)

Nombre de secondes à attendre avant de rejouer un job après une exception.

Autres options de worker

En plus de tries, timeout et backoff, chaque supervisor accepte des options qui contrôlent le comportement des processus workers et leurs redémarrages automatiques. Redémarrer régulièrement des processus de longue durée est une bonne pratique pour prévenir les fuites mémoire.
  • memory — mémoire maximale (en Mo) qu’un worker peut consommer avant redémarrage. Par défaut : 128.
  • maxJobs — nombre de jobs à traiter avant redémarrage. 0 = sans limite. Par défaut : 0.
  • maxTime — durée maximale (en secondes) d’exécution avant redémarrage. 0 = pas de redémarrage temporel. Par défaut : 0.
  • sleep — attente en secondes entre deux polls quand il n’y a pas de job. Par défaut : 3.
  • rest — pause en secondes entre chaque job. Par défaut : 0.
  • nice — priorité (« niceness ») du processus worker. Plus la valeur est élevée, plus la priorité est basse. Par défaut : 0.

Stratégies d’équilibrage

Horizon propose trois stratégies d’équilibrage.
Le nombre de workers s’ajuste automatiquement selon la charge. minProcesses et maxProcesses définissent l’intervalle.
  • time — mise à l’échelle selon le temps estimé pour vider la queue.
  • size — mise à l’échelle selon le nombre de jobs dans la queue.
Avec auto, l’ordre des queues n’implique aucune priorité. Pour imposer une priorité, utilisez plusieurs supervisors.
Fixe le nombre de workers et les répartit uniformément entre les queues indiquées.
Dans cet exemple, 5 workers sont attribués à default et 5 à notifications.
Traite les queues dans l’ordre strict de leur déclaration. Le comportement est celui de la queue Laravel classique, avec un scaling du nombre de workers selon le retard.
Les jobs de la queue default seront toujours traités avant ceux de notifications.

Autorisation du tableau de bord

Le tableau de bord est accessible via la route /horizon. En environnement local, il est ouvert à tous par défaut, mais en production, il faut restreindre son accès par une gate. Éditez la méthode gate() dans app/Providers/HorizonServiceProvider.php.
Si aucune authentification n’est requise (par exemple si vous protégez déjà l’accès par IP), rendez l’argument optionnel.

Démarrer Horizon

Commandes de base

Développement local : redémarrage automatique

Pour redémarrer Horizon automatiquement à chaque changement de fichier, utilisez horizon:listen.

Lancement permanent avec Supervisor

En production, utilisez Supervisor pour maintenir Horizon en vie.

Installation de Supervisor

Création du fichier de configuration

Créez /etc/supervisor/conf.d/horizon.conf.
stopwaitsecs doit être supérieur à la durée du job le plus long. Une valeur trop faible entraînera Supervisor à interrompre un job en cours.

Démarrer Supervisor

Lors du déploiement

À chaque déploiement, redémarrez Horizon pour prendre en compte les changements.
Avec autostart=true / autorestart=true, Supervisor relance Horizon automatiquement après l’arrêt.

Gestion des jobs

Tags

Horizon détecte automatiquement les modèles Eloquent liés à un job et lui ajoute des tags.
Pour définir manuellement des tags, implémentez la méthode tags().
Pour un écouteur d’événement, l’instance de l’événement est passée à tags().

Sourdine (silence)

Pour ne pas afficher certains jobs dans la liste « jobs terminés » du tableau de bord, mettez-les en sourdine dans config/horizon.php.
Vous pouvez aussi implémenter l’interface Silenced.

Métriques et supervision

Le tableau de bord des métriques d’Horizon affiche le débit et les temps d’exécution par job et par queue. Planifiez la prise de snapshots régulière.
L’option metrics.trim_snapshots de config/horizon.php définit le nombre de snapshots conservés pour les graphiques. Le seuil s’appliquant au nombre et non à l’ancienneté, la durée effective de rétention dépend de la fréquence de horizon:snapshot.
Pour supprimer toutes les métriques :

Notifications d’échec de job

Vous pouvez être notifié lorsque le temps d’attente d’une queue devient trop long. Configurez cela dans la méthode boot() de app/Providers/HorizonServiceProvider.php.

Seuil d’attente

L’option waits de config/horizon.php fixe le nombre de secondes d’attente qui déclenche une notification.
0 désactive la notification pour la queue concernée.

Gestion des jobs en échec

Vous pouvez supprimer un job en échec par son ID ou son UUID.
Pour vider tous les jobs d’une queue :

Mise à niveau

À chaque changement de version majeure d’Horizon, consultez le guide de mise à niveau.

Pages associées

Queues et jobs

Les bases des queues Laravel : création de job, dispatch, batching, gestion des échecs.

Redis

Configuration et utilisation de Redis, indispensable comme backend d’Horizon.
Dernière modification le 2 août 2026