
laravel horizon 并不取代标准队列系统,而是基于其构建的增强层;你仍需保留 `config/queue.php` 配置,但可停用 `queue:work` 的 supervisor 进程,改用 horizon 专属的 `horizon:work` 进程管理。
Laravel Horizon 是 Laravel 官方提供的、面向 Redis 驱动队列的监控与管理扩展,而非底层队列实现的替代品。它完全依赖 Laravel 原生的队列抽象(Illuminate\Queue\Queue)和驱动机制,因此 config/queue.php 不仅需要保留,还必须正确配置为 redis(Horizon 强制要求 Redis 作为队列驱动):
// config/queue.php
'default' => 'redis',
'connections' => [
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],
],✅ 关键点说明:
- ✅ queue.php 必须存在且生效 —— Horizon 的所有任务分发、延迟、重试等行为均通过该配置调用底层 RedisQueue 实现;
- ❌ 不可删除 QUEUE_CONNECTION=redis 等环境配置,否则 Horizon 启动将失败;
- ✅ Supervisor 配置需切换:queue:work 进程应被移除,仅保留 horizon:work;
在生产环境的 Supervisor 配置中,应替换为 Horizon 推荐方式(以 Laravel 10+/Horizon 5+ 为例):
# /etc/supervisor/conf.d/horizon.conf [program:horizon] process_name=%(program_name)s command=php /var/www/your-app/artisan horizon autostart=true autorestart=true user=www-data redirect_stderr=true stdout_logfile=/var/www/your-app/storage/logs/horizon.log stopwaitsecs=30
⚠️ 注意事项:
- Horizon 内部已封装并优化了 queue:work 的核心逻辑(如循环监听、任务执行、异常处理),并额外集成指标采集、进程自动伸缩、标签分类、失败任务搜索等功能;
- 若同时运行 queue:work 和 horizon:work,会导致同一队列被多个消费者争抢,引发重复执行或状态混乱;
- Horizon 启动后会自动注册信号处理器(如 SIGTERM),支持优雅关闭,无需额外定制;
- 本地开发时可通过 php artisan horizon 启动,生产部署务必配合 Supervisor 或 systemd 确保常驻运行。
总结而言:Horizon = Laravel Queue + Redis + Dashboard + Smart Supervision。它不是“另一个队列”,而是 Laravel 队列能力在可观测性与运维效率上的深度延伸。正确理解这一关系,是平稳落地 Horizon 的前提。










