Drupal → Модуль Background Queue — выполнение всей очереди в фоне

23.12.2015

Написал небольшой модуль, позволяющий выполнить всю очередь в фоне без вылета по таймауту — Background Queue.

Допустим у нас есть очередь на Queue API, которая будет выполняться 10 минут и необходимо по какому-то событию выполнить всю очередь в максимально короткое время. При стандартной схеме, когда часть очереди выполняется по крону, придётся ждать запуска крона и зависеть от его периодичности. При использовании модуля Background Queue достаточно вызвать background_queue_run('queue_name') или background_queue_run_from_cron('queue_name') (если это делается из hook_cron).

Как это работает — при вызове background_queue_run() модуль отправляет неблокирующий http запрос на адрес background-queue/queue_name, в page callback начинает выполняться часть очереди, при достижении лимита по времени модуль вызывает background_queue_run() и заканчивает работу, цикл повторяется пока вся очередь не будет выполнена. Принцип похож на Batch API, только работает без участия пользователя.

Пример кода:

/**
 * Implements hook_cron().
 */
function modulename_cron() {
  // Наполняем очередь
  $queue = DrupalQueue::get('test_queue');
  for ($i = 0; $i < 1000; $i++) {
    $queue->createItem($i);
  }

  // Запускаем выполнение очереди в фоне
  background_queue_run_from_cron('test_queue');
}

/**
 * Implements hook_cron_queue_info().
 */
function modulename_cron_queue_info() {
  $queues['test_queue'] = array(
    'worker callback' => 'modulename_test_queue_worker',
    'skip on cron' => TRUE,
  );
  return $queues;
}

/**
 * Queue worker.
 */
function modulename_test_queue_worker($i) {
  sleep(1);
}

Замечание:
Могут быть проблемы с работой модуля на некоторых конфигурациях nginx. Выражается в том, что nginx видя в асинхронном запросе Connection: Close не пробрасывает его на бакэнд. Для решения пишите хостеру.

Написанное актуально для
Drupal 7
Похожие записи

Комментарии

batch процесс, запущенный в фоне, делает не тоже самое?

Koreychenko
28.04.2016, 14:08

Такой функционал, есть в dev версии модуля Elysia Cron. Там очень удобно работать со всеми очередями.

не нашёл там похожего функционала

Гость
23.09.2018, 14:58

Можете подсказать настройки nginx, для корректной работы модуля?
В чем именно подводный камень?

А для Drupal 8 планируется обновить этот модуль? Или в D8 уже встроенное есть что-то для форсированного выполнения очереди?

Добавить комментарий