xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Написал небольшой модуль, позволяющий выполнить всю очередь в фоне без вылета по таймауту — 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
Похожие записи

Комментарии RSS

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

нет

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

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

Rabotayet xorosho, spasibo.

Доступен ли модуль?

доступен

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании