Laravel 4队列

9

我一直在使用Laravel 4中的队列系统,它非常好用!- 我想知道是否有一种方法可以查看队列中实际存在的内容?我正在使用redis作为后端。


你指的 "in the Queue" 是什么意思? - The Alpha
所有已排队但仍在等待处理的内容。 - Ben Kilah
你尝试过使用 php artisan queue:listen 吗? - Alen
2个回答

25

我花了一些时间研究队列驱动和API,并为您找到了答案。

简短版本:

队列接口中没有本地的Queue::getList()(或类似的)函数。

但是这将为您提供所有排队作业的列表,等待在您的default Redis队列中处理:

$list = (Queue::getRedis()->command('LRANGE',['queues:default', '0', '-1']));

如果您运行多个队列管道,请将default更改为其他名称。

请注意,该命令可能会导致返回非常大的数据集(就像倾倒数据库的一部分) - 因此,您可能只想获取排队作业的数量:

 $queue_length = (Queue::getRedis()->command('LLEN',['queues:default']));

长版本:

在队列接口上没有原生的Queue::getList()(或类似)函数。但是我注意到可以从队列接口获取Redis驱动程序:

$redis = Queue::getRedis();

挖掘Redis驱动程序 - 我们可以看到有一个名为command()的函数。它被定义为

command(string $method, array $parameters = array()) 
Run a command against the Redis database.

这意味着我们现在可以通过Laravel将任何本地Redis命令运行到Redis实例中。

这里是Redis命令的完整列表

通过浏览该列表,我们可以获得许多有用的命令用于队列。

首先,您可以查看所有可用的KEYS,如果您不确定队列的名称,则可能很有用:

$keys = Queue::getRedis()->command('KEYS',['*']);

在运行另一个操作之前,您还可以确保特定的KEY存在-像这样:

if (Queue::getRedis()->command('EXISTS',['queues:default']))
{
    // Queues:default key exists!
}

此外,您可以获取队列的长度-这非常有用。

 $queue_length = (Queue::getRedis()->command('LLEN',['queues:default']));

最后,您可以使用此命令获取整个队列列表

 $list = (Queue::getRedis()->command('LRANGE',['queues:default1', '0', '-1']));

如果您不想获取完整的列表(可能因为您的队列非常大),则可以获取其子集。在Redis文档中阅读有关LRANGE的更多信息。


@Ben Kilah - 这回答了你的问题吗?你需要更多的信息吗? - Laurence
非常感谢您的出色回答,很抱歉我来晚了! :) - Ben Kilah

0

虽然不完全适用于你的情况,但可以作为其他人的参考。

如果您正在使用beanstalkd驱动程序,则可以像这样访问该信息:

$stats = Queue::getPheanstalk()->stats();

其中stats变量将具有以下属性:

array(
   'current-jobs-urgent' => '0',
   'current-jobs-ready' => '5',
   'current-jobs-reserved' => '0',
   'current-jobs-delayed' => '0',
   'current-jobs-buried' => '0',
   'cmd-put' => '95',
   'cmd-peek' => '0',
   'cmd-peek-ready' => '130',
   'cmd-peek-delayed' => '32',
   'cmd-peek-buried' => '32',
   'cmd-reserve' => '0',
   'cmd-reserve-with-timeout' => '1142',
   'cmd-delete' => '90',
   'cmd-release' => '1124',
   'cmd-use' => '194',
   'cmd-watch' => '0',
   'cmd-ignore' => '0',
   'cmd-bury' => '0',
   'cmd-kick' => '0',
   'cmd-touch' => '0',
   'cmd-stats' => '37',
   'cmd-stats-job' => '32',
   'cmd-stats-tube' => '78822',
   'cmd-list-tubes' => '78822',
   'cmd-list-tube-used' => '0',
   'cmd-list-tubes-watched' => '0',
   'cmd-pause-tube' => '0',
   'job-timeouts' => '3',
   'total-jobs' => '95',
   'max-job-size' => '65535',
   'current-tubes' => '1',
   'current-connections' => '1',
   'current-producers' => '0',
   'current-workers' => '0',
   'current-waiting' => '0',
   'total-connections' => '40679',
   'pid' => '15937',
   'version' => '1.10',
   'rusage-utime' => '6.184000',
   'rusage-stime' => '16.808000',
   'uptime' => '146790',
   'binlog-oldest-index' => '0',
   'binlog-current-index' => '0',
   'binlog-records-migrated' => '0',
   'binlog-records-written' => '0',
   'binlog-max-size' => '10485760',
   'id' => '56d8d2c9888219bc',
   'hostname' => 'ddeath-pc',
)

例如,$stats['current-jobs-ready'] 将返回准备由工作进程处理的作业。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接