同一Redis环境下,能否用Laravel项目X的Horizon监控项目Y的队列?
结论:完全可行
Horizon依赖Redis存储队列元数据与任务信息,只要两个项目Redis配置完全一致,且X的Worker能识别Y的Job类,就能实现监控+任务处理。你之前任务失败的核心原因是X的Worker找不到Y项目里的Job类。
具体操作步骤
1. 同步Redis队列配置
检查项目Y的config/queue.php,确保connections.redis下的所有配置(主机、端口、密码、Redis数据库编号、队列前缀)和项目X完全一致,且两个项目的QUEUE_CONNECTION环境变量都设置为redis。
2. 让X能加载Y的Job类
这是实现需求的关键,X的Worker要处理Y的任务,必须能找到对应的Job类,有两种解决方式:
方法一:通过Composer自动加载Y的代码
在项目X的composer.json中,将Y项目的app目录加入自动加载规则(假设Y项目在X的同级目录):
"autoload": { "psr-4": { "App\\": "app/", "YApp\\": "../Y/app/" } }
执行composer dump-autoload更新自动加载规则,之后X就能识别Y项目的Job类。
方法二:抽离Job为共享包
如果两个项目有较多共用Job,可将这些Job抽离成独立的Composer包,在X和Y项目中同时安装该包,双方即可直接调用Job类。
3. 在Horizon中配置Y队列监控
编辑项目X的config/horizon.php,在对应环境(如production)的supervisors数组中,新增Y队列的监控配置:
'supervisors' => [ // 原X队列监控配置 [ 'name' => 'X-worker', 'connection' => 'redis', 'queue' => ['Xqueue'], 'balance' => 'auto', 'processes' => 3, 'tries' => 3, ], // 新增Y队列监控配置 [ 'name' => 'Y-worker', 'connection' => 'redis', 'queue' => ['Yqueue'], 'balance' => 'auto', 'processes' => 2, 'tries' => 3, ], ],
修改完成后重启Horizon:先执行php artisan horizon:terminate,再启动php artisan horizon。
4. 验证任务执行
在Y项目中分发任务时,注意Job的命名空间要与X自动加载的规则匹配:
dispatch(new \YApp\Jobs\TestJob())->onQueue('Yqueue');
此时打开X的Horizon面板,就能看到Y队列的任务状态,Worker也能正常执行任务。
常见问题排查
- 若任务仍失败,优先查看Horizon日志(
storage/logs/horizon.log),如果提示“Class not found”,检查Composer自动加载配置或Job命名空间是否正确。 - 确认两个项目使用同一个Redis数据库(
config/queue.php中的database参数),否则Horizon无法读取Y项目的队列数据。
内容的提问来源于stack exchange,提问作者Akhil

