Написал небольшой модуль, позволяющий выполнить всю очередь в фоне без вылета по таймауту — 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
не пробрасывает его на бакэнд. Для решения пишите хостеру.
- Модуль EAV Field — хранение большого числа характеристик сущности в одном поле
- Модуль Commerce Fast Ajax Add to Cart — ajax кнопка "Добавить в корзину" без кэширования формы
- Модуль Block Visibility by Vocabulary — вывод блока только на страницах терминов определённого словаря
- Модуль Auto-Dialog — показываем контент и формы в jQuery диалоге
- Модуль Views field replace value — замена значений полей в Views
Комментарии
batch процесс, запущенный в фоне, делает не тоже самое?
нет
Такой функционал, есть в dev версии модуля Elysia Cron. Там очень удобно работать со всеми очередями.
не нашёл там похожего функционала
Rabotayet xorosho, spasibo.
Доступен ли модуль?
доступен
Можете подсказать настройки nginx, для корректной работы модуля?
В чем именно подводный камень?
А для Drupal 8 планируется обновить этот модуль? Или в D8 уже встроенное есть что-то для форсированного выполнения очереди?
Пока не планируется
Добавить комментарий