Laravel 5.5 - Horizo​​n 不会自动运行第二个队列

Won*_*nka 3 php laravel laravel-5 laravel-horizon

在 Forge 和 Redis 上使用 Laravel Horizo​​n,我有一个default队列和一个notifications队列。

通知作业都在最近的作业下建立了暂停状态,并且不会得到处理。这是使用的代码:

$event->owner->notify((new ItemWasLiked($event))->onQueue('notifications'));
Run Code Online (Sandbox Code Playgroud)

我发现处理它们的唯一方法是手动显式运行以下命令以notifications进行处理:

php artisan queue:work --queue=notifications
Run Code Online (Sandbox Code Playgroud)

当它进来时,这不应该是自动的吗?我错过了什么?

Cy *_*nol 5

我们需要通过在config/horizo​​n.php 中的队列工作器配置中添加一个元素来指示 Horizo​​n 启动一个队列工作器来处理notifications队列和default队列:

'environments' => [
    ...
    '(environment name)' => [
        'supervisor-1' => [
            ...
            'queue' => [ 'default', 'notifications' ],
        ],
    ],
],
Run Code Online (Sandbox Code Playgroud)

'queue'指令声明了 Horizo​​n 工作线程监视作业的队列。开箱即用的配置仅指定default队列,因此工作人员将仅处理推送到该队列的作业。以上大致相当于:

php artisan queue:work --queue=default,notifications
Run Code Online (Sandbox Code Playgroud)

...其中逗号分隔列表中的第一个队列具有最高优先级,最后一个队列具有最低优先级。Horizo​​n 通过分配更大份额的进程而不是按优先级顺序处理队列来确定队列的优先级。

或者,我们可以将第二个工作组添加到处理第二个队列的配置中:

'(environment name)' => [
    'supervisor-1' => [
        ...
        'queue' => [ 'default' ],
    ],
    'supervisor-2' => [
        ...
        'queue' => [ 'notifications' ],
    ],
],
Run Code Online (Sandbox Code Playgroud)

...为此,Horizo​​n 为同时运行的两个队列中的每一个启动队列工作进程。

  • 你是救命稻草!我昨天花了一整天试图弄清楚这一点。因此,我在 `horizo​​n.php` 中正确设置了所有队列,除了“(环境名称)”,因为我的是“开发”,而不是默认的“生产”/“本地”。所以我用队列在地平线上添加了一个“开发”块,它工作得很好。再次感谢你让我开心! (2认同)