Пример фонового (без индикатора прогресса) выполнения 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.
Спасибо, работает!
Только есть вопросы:
Что значит строчка "$batch =& batch_get();" ?
И что значит операция операция "=&" ?
http://php.net/manual/ru/language.operators.assignment.php
У меня по этому поводу есть вопрос
Можно ли с помощью Queue API проделать операции со всеми пользователями на сайте по крону? - С помощью Batch API можно просто выбирать с базы по 10 пользователей на каждой итерации.
Или распарсить массивный XML файл? - С помощью Batch API это тоже возможно по крону. И еще в Batch есть возможность хранить данные в $context и передавать их от операции к операции.
Есть ли такой функционал в Queue API? Как я понял это просто очередь которая выполняется по крону и если я хочу проделать операции со всеми пользователями, мне нужно каждого добавить в очередь, что явно может быть трудоемко
@Alex Milkovsky, поподробнее сформулируйте задачу
У меня не конкретная задача. Просто хотел понять возможности Queue API.
Например, на сайте есть очень много пользователей. И нужно по крону пройтись по всем пользователям и с каждым пользователем выполнить операцию(например, обновить значения полей). Это возможно сделать с помощью Queue API?
возможно. только если речь о выполнении всей очереди за один запуск, то непонятно зачем вам в таком случае нужна очередь.
об этом и был мой комментарий Пнд 04/03/2013 - 12:55.
В этом случае целесообразно использовать Batch API выбирая на каждой итерации пользователей порциями. Что, похоже, не возможно сделать с Queue API.
в этом случае целесообразно ничего не использовать. что вам мешает в hook_cron выполнить все манипуляции?
если пользователей 1000000... , можно всех в foreach перебрать?
и batch и queue это тот же самый foreach
я, даже как то не думал об этом. Думал, что когда Batch скрипт срабатывает по крону, тоже выполняются пакетные запросы...
В каком случае тогда может пригодится фоново выполнить Batch в hook_cron()?
в случае невозможности участия человека в запуске batch-а
Добрый день. Скажите пожалуйста, можно ли таким образом обновлять выгрузку товаров по серверному крону. У меня имеется выгрузка товаров обновляемая раз в сутки. Имеется модуль , который по нажатию кнопки обновляет выгрузку. Однако, попытка обновить выгрузку автоматизированно не увенчалась успехом. Модуль использует batch.
таким способом можно запускать batch в фоне, не больше
Запускать в фоне? Какое время? 30-60 секунд или 5 минут или может несколько часов отработать? От чего зависит? Где посмотреть?
Раньше делал через Queue API, но нужен запуск крон или отдельного файлика по крон.
А когда запускаешь Batch, то все функции отрабатывают постоянно, не прерываясь как в Queue. Получается быстрее.
отработает max_execution_time
уставить можно с помощью drupal_set_time_limit()
Вопрос больше по Queue API: батч имеет контекст, который можно использовать для хранения некоторой информации, и функцию, отрабатывающую по завершению, в котрой можно всю собранную информацию обработать. В Queue такой функции к сожалению не нашел.
Пример такой: обновление товаров по коду, обо всех не найденных кодах необходимо уведомить письмом. В батче можно собрать их в контексте и по finished отправить одним письмом? А тут как? спамить о каждом?
Можно, конечно, создать еще одну очередь, которую не выполнять по общему крону, а в отдельном файле запустить, при это сохраняя данные куда-то глобально, но уж больно костылями отдает.
Добавить комментарий