如何在redis上的laravel队列中获取所有挂起的作业?

时间:2016-02-15 15:11:27

标签: laravel redis

队列侦听器未在服务器上启动,某些作业被推送(使用Redis驱动程序)。

我怎么能算上(或得到所有)这些工作?我没有找到任何工匠命令来获取这些信息。

7 个答案:

答案 0 :(得分:15)

如果有人在这里寻找答案就是我的方式:

$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是Redis连接名称,默认为null,$queue是队列/管的名称,默认为'默认情况下!

答案 1 :(得分:7)

自Laravel 5.3起,您只需使用Queue::size()(请参阅PR)。

答案 2 :(得分:6)

您也可以直接使用Redis Facade:

use Redis;

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

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

答案 3 :(得分:3)

我是PHP Laravel开发人员,已经三年了,我最近才知道这些命令,所以让我感到羞耻。 ;(

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

use Redis;
$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');

答案 4 :(得分:2)

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

composer require laravel/horizon

php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

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

通过Laravel 5.6测试

答案 5 :(得分:0)

如果有人仍在寻找使用Laravel较早版本的方法:

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

答案 6 :(得分:0)

我的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;
    }
}

artisan命令然后列出队列中的所有对象

> 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