Drupal → Фоново выполнить Batch в hook_cron()

24.05.2012

Пример фонового (без индикатора прогресса) выполнения Batch в hook_cron():

/**
 * Implements hook_cron().
 */
function MODULENAME_cron() {
  batch_set(array(...));
  $batch = &batch_get();
  $batch['progressive'] = FALSE;
  batch_process('');
}
Написанное актуально для
Drupal 6, Drupal 7
Похожие записи

Комментарии

А какой смысл в фоновом батче? Проще уже без батча порцию данных на обработку отправить, быстрее будет.

например выполнить весь batch за один запуск крона

Не совсем стандартное использование батча. Я не уверен насколько оно оправдано в производительности. Для выполнения атомарных операций в фоне придуман Queue API.

milkovsky
11.07.2012, 12:14

Спасибо, работает!

Только есть вопросы:
Что значит строчка "$batch =& batch_get();" ?
И что значит операция операция "=&" ?

Alex Milkovsky
04.03.2013, 12:55

Не совсем стандартное использование батча. Я не уверен насколько оно оправдано в производительности. Для выполнения атомарных операций в фоне придуман Queue API.

У меня по этому поводу есть вопрос
Можно ли с помощью Queue API проделать операции со всеми пользователями на сайте по крону? - С помощью Batch API можно просто выбирать с базы по 10 пользователей на каждой итерации.
Или распарсить массивный XML файл? - С помощью Batch API это тоже возможно по крону. И еще в Batch есть возможность хранить данные в $context и передавать их от операции к операции.

Есть ли такой функционал в Queue API? Как я понял это просто очередь которая выполняется по крону и если я хочу проделать операции со всеми пользователями, мне нужно каждого добавить в очередь, что явно может быть трудоемко

@Alex Milkovsky, поподробнее сформулируйте задачу

Alex Milkovsky
04.03.2013, 17:12

У меня не конкретная задача. Просто хотел понять возможности Queue API.
Например, на сайте есть очень много пользователей. И нужно по крону пройтись по всем пользователям и с каждым пользователем выполнить операцию(например, обновить значения полей). Это возможно сделать с помощью Queue API?

возможно. только если речь о выполнении всей очереди за один запуск, то непонятно зачем вам в таком случае нужна очередь.

Alex Milkovsky
04.03.2013, 17:26

об этом и был мой комментарий Пнд 04/03/2013 - 12:55.
В этом случае целесообразно использовать Batch API выбирая на каждой итерации пользователей порциями. Что, похоже, не возможно сделать с Queue API.

в этом случае целесообразно ничего не использовать. что вам мешает в hook_cron выполнить все манипуляции?

Alex Milkovsky
04.03.2013, 17:41

если пользователей 1000000... , можно всех в foreach перебрать?

Alex Milkovsky
04.03.2013, 17:51

я, даже как то не думал об этом. Думал, что когда Batch скрипт срабатывает по крону, тоже выполняются пакетные запросы...
В каком случае тогда может пригодится фоново выполнить Batch в hook_cron()?

в случае невозможности участия человека в запуске batch-а

MuskusDuck
22.10.2013, 20:42

Добрый день. Скажите пожалуйста, можно ли таким образом обновлять выгрузку товаров по серверному крону. У меня имеется выгрузка товаров обновляемая раз в сутки. Имеется модуль , который по нажатию кнопки обновляет выгрузку. Однако, попытка обновить выгрузку автоматизированно не увенчалась успехом. Модуль использует batch.

таким способом можно запускать batch в фоне, не больше

Игорь
25.03.2015, 23:31

Запускать в фоне? Какое время? 30-60 секунд или 5 минут или может несколько часов отработать? От чего зависит? Где посмотреть?
Раньше делал через Queue API, но нужен запуск крон или отдельного файлика по крон.
А когда запускаешь Batch, то все функции отрабатывают постоянно, не прерываясь как в Queue. Получается быстрее.

отработает max_execution_time
уставить можно с помощью drupal_set_time_limit()

Вопрос больше по Queue API: батч имеет контекст, который можно использовать для хранения некоторой информации, и функцию, отрабатывающую по завершению, в котрой можно всю собранную информацию обработать. В Queue такой функции к сожалению не нашел.
Пример такой: обновление товаров по коду, обо всех не найденных кодах необходимо уведомить письмом. В батче можно собрать их в контексте и по finished отправить одним письмом? А тут как? спамить о каждом?

Можно, конечно, создать еще одну очередь, которую не выполнять по общему крону, а в отдельном файле запустить, при это сохраняя данные куда-то глобально, но уж больно костылями отдает.

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