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);
}
Написанное актуально для Drupal 7
Похожие записи

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

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

нет

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

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

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

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

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