如何在 redis 上获取 laravel队列中的所有待处理作业


How to get all pending jobs in laravel queue on redis?

queue:listen没有在服务器上运行,因此推送了一些作业(使用 Redis 驱动程序(,但从未运行过。

我如何计算(或获得所有(这些工作?我没有找到任何工匠命令来获取这些信息。

如果有人仍在寻找答案,这是我的做法:

$connection = null;
$default = 'default';
// For the delayed jobs
var_dump(
    'Queue::getRedis()
        ->connection($connection)
        ->zrange('queues:'.$default.':delayed', 0, -1)
);
    
// For the reserved jobs
var_dump(
    'Queue::getRedis()
        ->connection($connection)
        ->zrange('queues:'.$default.':reserved', 0, -1)
);

$connection是默认情况下null的 Redis 的连接名称,$default是默认default的队列的名称。

从 Laravel 5.3 开始,您可以简单地使用Queue::size()(参见 PR(。

您也可以通过执行以下操作直接使用 Redis 外观:

use Redis;
'Redis::lrange('queues:$queueName', 0, -1);

在 Laravel 5.6 中测试,但应该适用于所有 5.X。

如果您为队列使用redis驱动程序,则可以按名称计算所有剩余的作业:

use Redis;
// List all keys with status (awaiting, reserved, delayed)
Redis::keys('*');
// Count by name
$queueName = 'default';
echo Redis::llen('queues:' . $queueName);
// To count by status:
echo Redis::zcount('queues:' . $queueName . ':delayed', '-inf', '+inf');
echo Redis::zcount('queues:' . $queueName . ':reserved', '-inf', '+inf');

要立即查看结果,您可以使用 php artisan tinker 并点击 Redis::llen('queues:default'); .

您可以安装 Horizon。Laravel Horizon提供了一个用于监控队列的仪表板,并允许您对队列进行更多配置。

composer require laravel/horizon
php artisan vendor:publish --provider="Laravel'Horizon'HorizonServiceProvider"

您必须设置.env配置文件和config/horizon.php文件。

使用Laravel5.6进行测试

在我的 laravel 5.7 项目中,我有两个队列,一个默认队列和一个low_prio队列。

<?php
namespace App'Console'Commands;
use Illuminate'Console'Command;
class JobsOnQueue extends Command
{
    // su -c "php artisan jobs:on:queue" -s /bin/sh www-data
    protected $signature = 'jobs:on:queue';
    protected $description = 'Print jobs in redis';
    protected $lines = [];
    public function handle()
    {
        $connection = null;
        $queuename       = 'default';
        $default_delayed = 'Queue::getRedis()
            ->connection($connection)
            ->zrange('queues:' . $queuename . ':delayed', -9999, 9999);
        $default_reserved = 'Queue::getRedis()
            ->connection($connection)
            ->zrange('queues:' . $queuename . ':reserved', -9999, 9999);
        $queuename        = 'low_prio';
        $low_prio_delayed = 'Queue::getRedis()
            ->connection($connection)
            ->zrange('queues:' . $queuename . ':delayed', -9999, 9999);
        $low_prio_reserved = 'Queue::getRedis()
            ->connection($connection)
            ->zrange('queues:' . $queuename . ':reserved', -9999, 9999);
        $this->getQueueData('default delayed', $default_delayed);
        $this->getQueueData('default reserved', $default_reserved);
        $this->getQueueData('low prio delayed', $low_prio_delayed);
        $this->getQueueData('low prio reserved', $low_prio_reserved);
        $this->info(join("'n", $this->lines));
    }
    private function getQueueData($title, $arr)
    {
        $this->lines[] = "*** $title ***";
        if (count($arr) == 0) {
            $this->lines[] = "Nothing on queue";
            $this->lines[] = "";
            return;
        }
        foreach ($arr as $json) {
            $queue = json_decode($json);
            $data  = $queue->data;
            if (isset($data) && isset($data->command)) {
                $this->getCommands($data->command);
            }
        }
        $this->lines[] = "";
    }
    private function getCommands($serialized)
    {
        $readable = str_replace(
            'O:43:"Illuminate'Foundation'Console'QueuedCommand',
            'O:33:"App'Support'ReadableQueuedCommand',
            $serialized);
        $readable = unserialize($readable);
        $command  = $readable->getData();
        $attribs = [];
        $options = $command[1];
        foreach ($options as $key => $value) {
            $attribs[] = $key . '=' . $value;
        }
        $this->lines[] = $command[0] . ' ' . join(" - ", $attribs);
    }
}

ReadableQueuedCommand 看起来像这样

<?php
namespace App'Support;
use Illuminate'Foundation'Console'QueuedCommand;
class ReadableQueuedCommand extends QueuedCommand
{
    public function getData()
    {
        return $this->data;
    }
}

然后,工匠命令列出队列中的所有内容

> php artisan jobs:on:queue
*** default delayed ***
Nothing on queue
*** default reserved ***
Nothing on queue
*** low prio delayed ***
Nothing on queue
*** low prio reserved ***
oppty:time:profile --by-dataset=2
oppty:on:reset:pages --by-dataset=2

如果有人仍在寻找旧版本的 Laravel:

$connection = 'queue';
$queueName = 'default';
$totalQueuedLeads = Redis::connection($connection)
    ->zcount('queues:'.$queueName.':delayed' , '-inf', '+inf');