Я использовал систему очередей в Laravel 4, и она отлично работает! - Мне было интересно, есть ли способ просмотреть, что на самом деле находится в очереди? Я использую Redis для серверной части.

9
Ben Kilah 21 Май 2014 в 01:32

2 ответа

Лучший ответ

Я потратил некоторое время на копание в драйвере очереди и API. Я смог найти для вас ответ.

Короткая TL; версия DR:

В интерфейсе очереди нет встроенной функции 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 из интерфейса Queue:

$redis = Queue::getRedis();

Покопавшись в драйвере Redis, мы увидим, что есть функция под названием command(). Что определяется как

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

Это означает, что теперь мы можем запускать любую собственную команду Redis через Laravel в экземпляре Redis.

Полный список команд Redis здесь

Просматривая этот список, мы получаем ряд полезных команд, которые мы можем использовать для очередей.

Во-первых, вы можете просмотреть все доступные KEYS, что может быть полезно, если вы не уверены в названиях ваших очередей:

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

Вы также можете убедиться, что конкретный КЛЮЧ существует, прежде чем запускать другую операцию, например:

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']));

Если вам не нужен полный список (возможно, ваша очередь довольно большая) - вы можете получить его подмножество. Дополнительную информацию о LRANGE можно найти в документации Redis здесь.

24
Laurence 31 Май 2014 в 14:09

Не совсем ответ для вашего случая, но просто как ссылка для других.

Если вы используете драйвер 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'] вернет задания, готовые к обработке рабочим.

0
Dusan Plavak 17 Май 2015 в 09:20