You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用项目X的Laravel Horizon监控项目Y的Redis队列?

方案可行性与解决办法

这个方案完全可行,你遇到的任务失败核心原因是:X项目的Worker进程无法加载Y项目的Job类文件,导致任务执行时触发「类找不到」的错误。下面是具体解决步骤和更稳妥的替代方案:

核心解决思路:让X的Worker能加载Y的Job类

两个项目共用Redis队列,任务被推送到Redis后,X的Worker会尝试执行,但它找不到Y项目里的TestJob类,所以任务持续失败。你需要让X的PHP环境能加载到Y的代码:

1. 修改X项目的Composer自动加载配置

假设Y项目和X项目在服务器上是同级目录(比如X在/var/www/X,Y在/var/www/Y),编辑X项目根目录下的composer.json,在autoload的psr-4节点中添加Y项目的命名空间映射:

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "YApp\\": "../Y/app/" // 这里的YApp对应Y项目的根命名空间,可根据实际情况调整
    }
}

注意:如果Y项目的根命名空间也是App,可以改成YApp后,同步修改Y项目中Job类的命名空间(比如把namespace App\Jobs;改成namespace YApp\Jobs;),避免命名冲突。

修改完成后,在X项目根目录执行:

composer dump-autoload

更新自动加载映射。

2. 配置X的Horizon监控Y的队列

编辑X项目的config/horizon.php,在对应环境的Supervisor配置中加入Yqueue,确保Horizon能监控这个队列:

'environments' => [
    'production' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['Xqueue', 'Yqueue'],
            'balance' => 'auto',
            'processes' => 10,
            'tries' => 3,
        ],
    ],
    // 其他环境同理配置
],

重启Horizon服务生效:

php artisan horizon:restart

3. 额外注意事项

  • 如果Y的Job依赖Y项目的模型、服务类等,需要同样在X的自动加载中添加对应路径,或者把共用类抽成独立的Composer包,让两个项目都依赖这个包,避免代码耦合。
  • 确保X项目的Worker进程有读取Y项目文件系统的权限,否则会出现文件读取失败的错误。

更稳妥的替代方案:独立配置Horizon

如果不想让两个项目的代码耦合在一起,更推荐在Y项目中也配置Horizon:

  1. 在Y项目中安装Horizon:composer require laravel/horizon
  2. 发布Horizon配置文件:php artisan horizon:install
  3. 修改Y项目的config/horizon.php,只监控Yqueue
  4. 启动Y的Horizon服务:php artisan horizon

这种方式下,两个Horizon实例共用Redis,各自监控自己的队列,代码完全隔离,更利于长期维护。

内容的提问来源于stack exchange,提问作者Appu Rajendran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:00:09