Laravel Horizon 与标准队列的关系详解:配置、替代性与最佳实践

Laravel Horizon 与标准队列的关系详解:配置、替代性与最佳实践

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+ 为例):

腾讯AI 开放平台

腾讯AI 开放平台

腾讯AI开放平台

下载

# /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 的前提。

https://www.php.cn/faq/1971797.html

发表回复

Your email address will not be published. Required fields are marked *