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

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

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

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

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

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

Спасибо!

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

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

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

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

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

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

У меня по этому поводу есть вопрос
Можно ли с помощью 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 отправить одним письмом? А тут как? спамить о каждом?

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

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

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

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