
laravel horizon 并不取代标准队列系统,而是构建在其之上;你仍需保留 `config/queue.php` 配置,但可移除 `queue:work` 的 supervisor 进程配置,改用 `horizon:work` 统一管理。
Laravel Horizon 是 Laravel 官方推出的高性能队列监控与管理解决方案,它不是独立的队列驱动,而是一个基于原生队列系统的增强层。这意味着:
- ✅ 你必须继续使用 config/queue.php —— Horizon 依赖其中定义的队列连接(尤其是 redis 驱动),并在此基础上添加仪表盘、自动缩放、标签分组、延迟/重试策略等高级功能;
- ❌ 不可删除 QUEUE_CONNECTION=redis 等核心配置,否则 Horizon 将无法启动或报错(如 Driver [redis] not supported);
- ⚙️ Horizon 启动的 horizon:work 命令本质是 queue:work 的封装扩展版,它内部仍调用相同的 Illuminate/Queue/Worker,但增加了心跳上报、进程健康检查、动态平衡等能力。
在生产环境部署时,Supervisor 配置需做关键调整:
; ✅ 正确:仅保留 Horizon 的 Supervisor 配置(示例) [program:laravel-horizon] process_name=%(program_name)s command=php /var/www/myapp/artisan horizon autostart=true autorestart=true user=www-data redirect_stderr=true stdout_logfile=/var/www/myapp/storage/logs/horizon.log
; ❌ 移除:不再需要单独的 queue:work 进程(避免重复消费) ; [program:laravel-queue-worker] ; command=php /var/www/myapp/artisan queue:work --sleep=3 --tries=3 ; ...
⚠️ 注意事项:
- Horizon 要求 Redis 作为唯一支持的队列驱动(不兼容 database、sync 或 beanstalkd);
- 若项目中混用多种队列连接(如 redis 用于任务、database 用于日志),Horizon 仅监控 redis 连接,其他连接仍需手动维护;
- Horizon 进程本身即为“工作进程管理者”,它会根据配置自动派生多个 horizon:work 子进程(而非传统 queue:work –daemon),因此无需额外守护 queue:work;
- 升级 Horizon 后务必运行 php artisan horizon:publish 同步最新配置,并重启 Horizon 进程(php artisan horizon:terminate)。
总结来说:Horizon = Laravel 队列 + Redis + 实时监控 + 智能调度。它强化而非替代底层队列机制,合理配置 queue.php 并统一使用 horizon:work,才能发挥其最大价值。
