Как пакетная обработка работает вокруг тайм-аута PHP

9

Документация Drupal 7 представляет Batch API как:

Функции, позволяющие распределять обработку форм по нескольким запросам страниц, таким образом гарантируя, что обработка не будет прервана из-за тайм-аута PHP ...

Я решил, что это означает, что Batch обрабатывает проблемы, связанные с тайм-аутом для разработчика.

Однако другие публикации (т. Е. Как пакетный API работает внутренне? ) Подразумевают, что разработчик обязан сообщить Batch, сколько работы нужно выполнить, прежде чем ждать прихода другого пользователя и повторного вызова Batch - тем самым избегая тайм - аут.

Если последнее верно, то я предполагаю, что Batch не гарантирует, что задания не будут превышены по времени. Предоставляет ли Batch какие-либо гарантии? Разработчик должен угадать, сколько Batch может обработать до истечения времени ожидания?

Спасибо!

Тостер
источник
3
Это чертовски хороший вопрос, спасибо :-)
Chapabu

Ответы:

5

Пакет просто говорит: «Я сделаю N раз (максимум), а затем обновлю страницу ... и сделаю больше».

Если вы скажете сделать 5 элементов на блок задания, каждый из которых занимает 5 секунд, у вас все будет в порядке со значением таймаута php по умолчанию, равным 30 секундам.

Если вы скажете сделать 20 элементов на блок задания, каждый из которых занимает 5 секунд, ваша нагрузка на запрос слишком высока и, скорее всего, истечет время ожидания.

Помните, когда у вас в PHP жизненный цикл страницы request in -> response out. И что ваш веб-сервер поддерживает каждый поток в течение ограниченного периода времени. Вы должны обойти этот тайм-аут - что вам поможет в Batch API.

Запуск вещей, скажем, Drush, на стороне сервера с использованием модулей сообщества, таких как Migrate, может помочь вам полностью избежать тайм-аутов, если это будет необходимо.

РЕДАКТИРОВАТЬ

Также имейте в виду, что каждый запрос страницы является полным начальным загрузчиком drupal, и Batch API начинает с того места, где он остановился. Это одна из самых дорогих операций при использовании Batch API, перезагружая drupal каждые N элементов. Вот почему люди работают над техникой на стороне сервера для создания узлов, импорта контента и т. Д. Пакетный API отлично подходит для простых повторяющихся задач. Но он имеет тенденцию распадаться либо на сложные, либо на очень очень большие наборы данных.

tenken
источник
1
Вы говорите, что пакет вызывается при каждой загрузке страницы; то есть. Пакет просыпается, чтобы увидеть, есть ли какие-либо задачи (например, cron бедняков)? Это подозревалось; Однако я не понимаю, почему вы подчеркнули вычислительную стоимость процесса. Разве дополнительная цена - это не несколько сравнений, а то, какую работу Batch выполняет в своей очереди, или Batch делает что-то особенное, например, вызывает себя, загружая страницу?
Тостер
1
см. ответ kiamlaluno ниже. Страница индикатора выполнения пакета просто перезагружается через X секунд. Если вы загрузите Firebug или Chrome на вкладке «Сеть» и запустите задание Batch API, посмотрите URL-адреса, и вы просто увидите ту же страницу, которая вызывается с разными смещениями элементов и размерами чанков. Стоимость вычислений для начальной загрузки всех друпалов при каждом запросе к странице ВЫСОКАЯ. Например, запуск импорта Drush sql загружает drupal только один раз. Для больших наборов данных и проблем накладные расходы на пакетный API становятся слишком высокими.
Tenken
3

Пакетный API просто регистрируется _batch_shutdown()как функция выключения с помощью register_shutdown_function(). Эта функция просто сохраняет в таблице базы данных текущее состояние выполняемого пакета.
Пакетный API не дает никакой гарантии, что выполняемая вами операция не прерывается в середине. Вот почему пакетные операции обычно выполняют простые операции, такие как чтение строки базы данных из сохранения таблицы и сохранение строки базы данных в другой таблице.

киамлалуно
источник