Как обрабатывать более одного элемента из очереди при каждом запуске?


Я настроил очередь, используя:

  function custom_logger_cron_queue_info()
  {
    $queues['custom_logger'] = array(
      'worker callback' => 'custom_logger_import',
      'time' => 60,
    );
    return $queues;
  }

К которым я добавляю элементы, используя:

$item = array('uri' => $uri, 'uid' => $uid, 'fid' => $fid);
$queue = DrupalQueue::get('custom_logger');
$queue->createItem($item);

, Который отлично работает, за исключением того, что, когда cron запускается каждую минуту для этой очереди (я использую модуль ultimate_cron для установки этого), функция custom_logger_import обрабатывает только один элемент за запуск. В настоящее время у меня есть функция, просто настроенная как:

function custom_logger_import($item) {
    $uri = $item['uri'];
    $uid = $item['uid'];
    $fid = $item['fid'];
//Do some stuff
}

Есть ли что-то, чего мне не хватает для обеспечения запуска как можно большего количества элементов? Это всего лишь небольшие рабочие места это выполняется менее чем за пару секунд, но на данный момент требуется 3-4 минуты, чтобы обработать всего 3 элемента.

ОБНОВЛЕНИЕ:

На самом деле проблема была в моей вызываемой функции. Я использовал sql, не дружественный к drupal, который, казалось, мешал выполнению работы более одного раза. После обновления всех материалов, связанных с базой данных, до материалов уровня извлечения базы данных, дружественных к drupal, все работает нормально. Для справки, вот хороший способ проверить, все ли в порядке с очереди. Закомментируйте вашу функцию, вызываемую очередью, и добавьте это взамен:

$file = '/somepath/hello.txt';
$current = file_get_contents($file);
$current .= $item['some variable from your queue item'] . " Hello\n";
file_put_contents($file, $current);

Затем, когда очередь обрабатывается в cron, она должна распечатать каждую переменную элементов вашей очереди, за которой следует привет текстовому файлу.

Author: 7wonders, 2012-03-10

2 answers

Система очередей предназначена для обработки элементов до истечения времени. Может быть, это ошибка в Ultime Cron? Попробуйте запустить ядро по умолчанию cron.php чтобы убедиться в этом.

Вы уверены, что на самом деле добавляете несколько элементов для обработки? Проверьте свою таблицу очередей.

 3
Author: Berdir, 2012-03-10 10:24:29

Если вы хотите сделать это программно вместо задания cron, то это может быть один из вариантов -

$queue_machine_name = 'custom_logger';
$queue = \Drupal::queue($queue_machine_name); 
$queue_worker = \Drupal::service('plugin.manager.queue_worker')->createInstance($queue_machine_name);
$item_ids = ['1','2','3'];
foreach ($item_ids as $item){
  $queue_worker->processItem($item_id);  
}


 0
Author: sanket jain, 2020-03-16 10:04:52