Документация Drupal 7 представляет Batch API как:
Функции, позволяющие распределять обработку форм по нескольким запросам страниц, таким образом гарантируя, что обработка не будет прервана из-за тайм-аута PHP ...
Я решил, что это означает, что Batch обрабатывает проблемы, связанные с тайм-аутом для разработчика.
Однако другие публикации (т. Е. Как пакетный API работает внутренне? ) Подразумевают, что разработчик обязан сообщить Batch, сколько работы нужно выполнить, прежде чем ждать прихода другого пользователя и повторного вызова Batch - тем самым избегая тайм - аут.
Если последнее верно, то я предполагаю, что Batch не гарантирует, что задания не будут превышены по времени. Предоставляет ли Batch какие-либо гарантии? Разработчик должен угадать, сколько Batch может обработать до истечения времени ожидания?
Спасибо!
источник
Ответы:
Пакет просто говорит: «Я сделаю N раз (максимум), а затем обновлю страницу ... и сделаю больше».
Если вы скажете сделать 5 элементов на блок задания, каждый из которых занимает 5 секунд, у вас все будет в порядке со значением таймаута php по умолчанию, равным 30 секундам.
Если вы скажете сделать 20 элементов на блок задания, каждый из которых занимает 5 секунд, ваша нагрузка на запрос слишком высока и, скорее всего, истечет время ожидания.
Помните, когда у вас в PHP жизненный цикл страницы
request in -> response out
. И что ваш веб-сервер поддерживает каждый поток в течение ограниченного периода времени. Вы должны обойти этот тайм-аут - что вам поможет в Batch API.Запуск вещей, скажем, Drush, на стороне сервера с использованием модулей сообщества, таких как Migrate, может помочь вам полностью избежать тайм-аутов, если это будет необходимо.
РЕДАКТИРОВАТЬ
Также имейте в виду, что каждый запрос страницы является полным начальным загрузчиком drupal, и Batch API начинает с того места, где он остановился. Это одна из самых дорогих операций при использовании Batch API, перезагружая drupal каждые N элементов. Вот почему люди работают над техникой на стороне сервера для создания узлов, импорта контента и т. Д. Пакетный API отлично подходит для простых повторяющихся задач. Но он имеет тенденцию распадаться либо на сложные, либо на очень очень большие наборы данных.
источник
Пакетный API просто регистрируется
_batch_shutdown()
как функция выключения с помощьюregister_shutdown_function()
. Эта функция просто сохраняет в таблице базы данных текущее состояние выполняемого пакета.Пакетный API не дает никакой гарантии, что выполняемая вами операция не прерывается в середине. Вот почему пакетные операции обычно выполняют простые операции, такие как чтение строки базы данных из сохранения таблицы и сохранение строки базы данных в другой таблице.
источник