Как обрабатывать более одного элемента из очереди при каждом запуске?
Я настроил очередь, используя:
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, она должна распечатать каждую переменную элементов вашей очереди, за которой следует привет текстовому файлу.
2 answers
Система очередей предназначена для обработки элементов до истечения времени. Может быть, это ошибка в Ultime Cron? Попробуйте запустить ядро по умолчанию cron.php чтобы убедиться в этом.
Вы уверены, что на самом деле добавляете несколько элементов для обработки? Проверьте свою таблицу очередей.
Если вы хотите сделать это программно вместо задания 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);
}