Skip to main content

Horizon とは

Laravel Horizon は、LaravelのRedisキュー専用の監視ダッシュボードです。ジョブのスループット・実行時間・失敗状況をリアルタイムで可視化し、ワーカー設定をコードで管理できます。
Horizon はキューの基礎機能を拡張するパッケージです。まずキューとジョブの基本を理解してから読み進めてください。また、バックエンドには必ずRedisが必要です。

インストール

Horizon は Redis をキューバックエンドとして使用します。config/queue.phpQUEUE_CONNECTIONredis に設定されていることを確認してください。現時点で Redis Cluster には対応していません。
Composer でインストールします。
インストール後、Horizon のアセットと設定ファイルを公開します。
このコマンドで config/horizon.phpapp/Providers/HorizonServiceProvider.php が生成されます。

設定

config/horizon.php の構成

config/horizon.php はワーカーの設定をすべて管理するファイルです。中心となる設定が environments オプションです。
Horizon は内部で horizon という名前の Redis 接続を使用します。config/database.php でこの名前を他の接続に使わないでください。

CSP nonce(Content Security Policy)

Content Security Policy の一環として Horizon のビュー内で使われる script / style タグに nonce属性 を設定したい場合は、Horizon::cspNonce メソッドを使います。リクエストごとに新しい nonce を割り当てるため、通常はミドルウェア内で呼び出します。
このミドルウェアは config/horizon.phpmiddleware オプションに追加します。

スーパーバイザー(Supervisor)

各環境は1つ以上の「スーパーバイザー」を持てます。スーパーバイザーはワーカーグループの管理単位で、異なるキュー・バランス戦略・プロセス数を持つ複数のスーパーバイザーを同一環境で動かすことができます。

デフォルト値

defaults オプションで、すべてのスーパーバイザーに適用されるデフォルト値を設定できます。

メンテナンスモード

アプリケーションがメンテナンスモードのとき、Horizon はデフォルトでジョブを処理しません。強制的に処理させるには force オプションを使います。

ジョブの最大試行回数

tries0 にすると無制限の再試行を許可します。

ジョブのタイムアウト

timeoutconfig/queue.phpretry_after より数秒短い値を設定してください。また、auto バランス戦略ではこの値より長いジョブを強制終了する場合があります。

バックオフ(再試行の待機時間)

例外発生後に再試行するまでの待機秒数を指定します。

その他のワーカーオプション

triestimeoutbackoff 以外にも、各スーパーバイザーはワーカープロセスの挙動や自動再起動のタイミングを制御するオプションを受け付けます。長時間稼働するプロセスを定期的に再起動することは、メモリリークを防ぐ良い習慣です。
  • memory — 再起動までにワーカープロセスが消費できる最大メモリ量(MB)。デフォルトは 128
  • maxJobs — 再起動までに処理するジョブ数。0 は無制限を意味する。デフォルトは 0
  • maxTime — 再起動までにワーカーが稼働できる秒数。0 は時間による再起動なしを意味する。デフォルトは 0
  • sleep — ジョブがない場合に次のポーリングまで待機する秒数。デフォルトは 3
  • rest — 各ジョブの処理間に一時停止する秒数。デフォルトは 0
  • nice — ワーカープロセスの優先度(“niceness”)。値が大きいほど優先度は低くなる。デフォルトは 0

バランス戦略

Horizon には3種類のワーカーバランス戦略があります。
キューの負荷に応じてワーカー数を自動調整します。minProcessesmaxProcesses で範囲を指定します。
  • time — キューを空にするまでの推定時間でスケーリング
  • size — キュー内のジョブ数でスケーリング
auto 戦略ではキューの順序が優先度を意味しません。優先度を強制したい場合は複数のスーパーバイザーを使用してください。
ワーカー数を固定し、指定したキューに均等に分配します。
上記では defaultnotifications にそれぞれ5プロセスずつ割り当てられます。
キューを列挙した順に厳密に優先します。Laravelデフォルトのキューシステムと同様の動作ですが、積み残しに応じてワーカー数をスケーリングします。
default キューのジョブが常に notifications キューより先に処理されます。

ダッシュボードの認可

Horizon のダッシュボードは /horizon ルートでアクセスできます。ローカル環境ではデフォルトで誰でもアクセスできますが、本番環境ではゲート定義でアクセスを制限します。 app/Providers/HorizonServiceProvider.phpgate() メソッドを編集します。
認証を必要としない場合(IP制限などで保護している場合)は、引数をオプションにします。

Horizon の起動

基本コマンド

ローカル開発: 自動再起動

ファイル変更を検知してHorizonを自動再起動するには horizon:listen コマンドを使います。

Supervisor による常時起動

本番環境では Supervisor を使って Horizon を常時稼働させます。

Supervisor のインストール

設定ファイルの作成

/etc/supervisor/conf.d/horizon.conf を作成します。
stopwaitsecs は最も長いジョブの実行時間より大きな値を設定してください。小さすぎると、Supervisorがジョブを途中で強制終了させてしまいます。

Supervisor の起動

デプロイ時

コードをデプロイするたびに Horizon を再起動して変更を反映します。
Supervisor が autostart=true / autorestart=true になっていれば、終了後に自動で再起動されます。

ジョブの管理

タグ

Horizon はジョブに関連する Eloquent モデルを自動検出してタグを付けます。
手動でタグを定義するには tags() メソッドを実装します。
イベントリスナーでは、イベントインスタンスが tags() メソッドに渡されます。

サイレント化

ダッシュボードの「完了済みジョブ」リストに表示したくないジョブは、config/horizon.php でサイレント化できます。
Silenced インターフェースを実装する方法もあります。

メトリクスとモニタリング

Horizon のメトリクスダッシュボードにはジョブ・キューのスループットと実行時間が表示されます。定期的にスナップショットを取得するためのスケジュールを設定します。
config/horizon.phpmetrics.trim_snapshots オプションで、メトリクスグラフ用に保持するスナップショット数を設定できます。この設定はスナップショットの経過時間ではなく件数で制限するため、実際の保持期間は horizon:snapshot コマンドの実行頻度によって変わります。
メトリクスデータをすべて削除するには以下を実行します。

ジョブ失敗の通知

キューの待機時間が長くなったときに通知を受け取ることができます。app/Providers/HorizonServiceProvider.phpboot() メソッドで設定します。

待機時間のしきい値

config/horizon.phpwaits オプションで通知トリガーとなる待機秒数を設定します。
0 を設定するとそのキューの通知は無効になります。

失敗ジョブの管理

失敗したジョブは ID または UUID で削除できます。
キューのジョブをすべて消去するには以下を使います。

アップグレード

Horizon のメジャーバージョンアップ時はアップグレードガイドを必ず確認してください。

関連ページ

キューとジョブ

Laravel キューの基本。ジョブの作成・ディスパッチ・バッチ処理・失敗処理を解説。

Redis

Horizon のバックエンドとして必要な Redis の設定と使い方。
最終更新日 2026年7月22日