跳转到主要内容

什么是 Horizon

Laravel Horizon 是 Laravel 官方提供的专用于 Redis 队列的监控仪表盘。可以实时查看任务吞吐量、执行时间和失败情况,并通过代码管理 worker 配置。
Horizon 是对队列基础功能的扩展。请先了解队列与任务的基础,再阅读本文。此外,其后端必须是 Redis

安装

Horizon 使用 Redis 作为队列后端。请确认 config/queue.phpQUEUE_CONNECTION 已设置为 redis。目前尚不支持 Redis Cluster。
通过 Composer 安装。
安装后发布 Horizon 的资源与配置文件。
该命令会生成 config/horizon.phpapp/Providers/HorizonServiceProvider.php

配置

config/horizon.php 结构

config/horizon.php 集中管理 worker 的所有配置。核心选项是 environments
Horizon 内部会使用一个名为 horizon 的 Redis 连接。请不要在 config/database.php 中把这个名字用于其他连接。

Supervisor(监督者)

每个环境可以有一个或多个“Supervisor”。它们是 worker 组的管理单元,可以在同一个环境下运行多个具有不同队列、平衡策略和进程数的 supervisor。

默认值

defaults 选项可以设置应用于所有 supervisor 的默认值。

维护模式

当应用处于维护模式时,Horizon 默认不会处理任务。如果要强制处理,可以使用 force 选项。

任务最大重试次数

tries 设为 0 时表示允许无限次重试。

任务超时

timeout 应比 config/queue.php 中的 retry_after 短几秒。此外,auto 平衡策略下可能会强制中止超过该时间的任务。

退避(重试等待时间)

指定发生异常后到下一次重试的等待秒数。

平衡策略

Horizon 提供三种 worker 平衡策略。
根据队列负载自动调整 worker 数量。通过 minProcessesmaxProcesses 指定范围。
  • time — 根据清空队列的预计时间进行伸缩
  • size — 根据队列内的任务数进行伸缩
auto 策略下,队列的顺序并不代表优先级。如果需要强制优先级,请使用多个 supervisor。
固定 worker 数量,均匀分配给指定的队列。
上例会为 defaultnotifications 各分配 5 个进程。
严格按照列举的顺序作为优先级。行为与 Laravel 默认的队列系统类似,但会根据积压情况伸缩 worker 数量。
default 队列的任务始终优先于 notifications 队列被处理。

仪表盘的授权

Horizon 仪表盘可通过 /horizon 路由访问。本地环境默认对所有人开放,但生产环境需要通过 Gate 定义来限制访问。 编辑 app/Providers/HorizonServiceProvider.php 中的 gate() 方法。
如果无需登录(例如已通过 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 的指标仪表盘展示任务与队列的吞吐量和执行时间。需要定时执行快照命令来采集数据。
若要清除全部指标数据,执行以下命令。

任务失败通知

当队列的等待时间过长时可以接收到通知。可以在 app/Providers/HorizonServiceProvider.phpboot() 方法中配置。

等待时间阈值

config/horizon.phpwaits 选项中配置触发通知的等待秒数。
设为 0 表示禁用该队列的通知。

失败任务的管理

失败任务可以通过 ID 或 UUID 删除。
要清空队列中的任务,可以使用以下命令。

升级

Horizon 主版本升级前,请务必参考升级指南

相关页面

队列与任务

Laravel 队列的基础。任务的创建、派发、批处理与失败处理。

Redis

Horizon 后端所需的 Redis 配置与用法。
最后修改于 2026年7月18日