Как пакетный API работает внутри?

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

Я понимаю, что в его простейшей форме вы передадите массив значений (например, nids) и функцию для работы с этими значениями. Затем пакетный API обрабатывает фиксированное число этих значений с каждым запросом до его завершения.

При запуске пакета страница, похоже, использует запросы Ajax, чтобы показать ход выполнения пакетной операции (% done и messages). Я предполагаю, что он ждет, пока запрос не завершит обновление хода выполнения, а затем сразу же начнет следующий запрос?

Если страница с запросом на пакет закрыта, прекращается ли пакетная обработка? Будет ли он перезагружаться при повторном открытии одного и того же URL-адреса? Модуль миграции иногда продолжается, но, вероятно, использует очереди?

19 голосов | спросил MotoTribe 21 32012vEurope/Moscow11bEurope/MoscowWed, 21 Nov 2012 08:25:20 +0400 2012, 08:25:20

3 ответа


40

Вот как работает пакет (на основе моего понимания)

1. Initialize

  1. Инициализировать пакетную обработку. На основе конфигурации клиентов (браузеров) включен ли JavaScript или нет.
  2. Клиенты с поддержкой JavaScript идентифицируются с помощью файла cookie 'has_js', установленного в drupal.js. Если во время сеанса браузера текущего пользователя не была посещена страница с поддержкой JavaScript, возвращается версия, отличная от JavaScript.
  3. Если включен JavaScript Batch использует ajax запрос, чтобы поддерживать соединение в соответствии с запросом.
  4. Если JavaScript не включен Пакет использует для установки метатег в html, чтобы сделать регулярные интервалы обновления , чтобы поддерживать соединение в соответствии с запросом.

(Вот как обновляется индикатор выполнения прогресса выполнения задания.)

Пакетный процесс

  1. Для запуска процесса Batch создает очередь и добавляет все операции (функции и аргументы) , которые вы определяете в массиве пакетов, например

    $batch = array (
    'operations' => array(
      array('batch_example_process', array($options1, $options2)),
      array('batch_example_process', array($options3, $options4)),
      ),
    'finished' => 'batch_example_finished',
    'title' => t('Processing Example Batch'),
    'init_message' => t('Example Batch is starting.'),
    'progress_message' => t('Processed @current out of @total.'),
    'error_message' => t('Example Batch has encountered an error.'),
    'file' => drupal_get_path('module', 'batch_example') . '/batch_example.inc',
    );
    

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

  2. Теперь пакетный вызов претендует на элементы очереди один за другим и выполняет функцию, определенную с аргументами, которые определены в ней.

  3. Это важная часть. Функция (Операция), которая реализует пакетную операцию, должна аккуратно распределять данные и обрабатывать данные с учетом Предела памяти PHP, Тайм-аут . Несоблюдение этого приведет к вашей проблеме.
  

Я столкнулся с проблемой тайм-аута, используя миграцию на днях, и начал задаваться вопросом, как пакетный API работает внутри.

Пакетная функция

Функции, реализующие пакет, должны принимать следующие меры очень осторожно:

  • Количество элементов внутри операций для обработки, таких как

    if (!isset($context['sandbox']['progress'])) {
    $context['sandbox']['progress'] = 0;
    $context['sandbox']['current_node'] = 0;
    $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT nid) FROM {node}'));
    }
    
  • Ограничение количества элементов для обработки в одном вызове функции, например, установка предела,

    // For this example, we decide that we can safely process 5 nodes at a time without a timeout.
    $limit = 5;
    
  • Обновление процесса для последующей обработки, например,

    // Update our progress information.
        $context['sandbox']['progress']++;
        $context['sandbox']['current_node'] = $node->nid;
        $context['message'] = t('Now processing %node', array('%node' => $node->title));
    
  • Информирование механизма пакетной обработки о том, завершена ли партия или нет,

    // Inform the batch engine that we are not finished,
    // and provide an estimation of the completion level we reached.
    if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
      $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
     }
    

Большинство вышеперечисленных точек рассматриваются как операционные операции ядра Drupal, если они отсутствуют в функции «Реализация». Но всегда лучше всего определять в функции реализации

ПакетноеЗаконченный обратный вызов

  • Это последний обратный вызов, который вызывается при определении в массиве пакетов. Обычно это отчет о том, сколько обработано и т. д.

ОТВЕТЫ

  

Если страница с запросом на пакет закрыта, пакетная обработка   стоп? Будет ли он перезагружаться, когда снова откроется тот же URL-адрес? Миграция   модуль иногда продолжается, но он, вероятно, использует очереди?

Да, в идеале он должен перезапустить пакет, и, как сказано выше, он основан на функции, которую вы реализуете.

Чтобы решить вашу проблему PHP Time out, используйте пакет Drush, который доступен в модуле миграции, но сначала выкачайте пакетные функции переноса и попробуйте обрезать данные обработки.

ответил Dinesh Kumar Sarangapani 21 32012vEurope/Moscow11bEurope/MoscowWed, 21 Nov 2012 12:36:54 +0400 2012, 12:36:54
10
  

Если страница с запросом на пакет закрыта, завершение пакетной обработки?

Да, он будет остановлен.

  

Будет ли он перезагружаться при повторном открытии одного и того же URL-адреса? Модуль миграции иногда продолжается, но, вероятно, использует очереди?

Как сказал Динеш, его значение зависит от реализации.

Вы должны запустить миграцию с помощью drush, потому что

  

Drush запускается в командной строке и не подлежит никаким временным ограничениям   (в частности, max_execution_time PHP не применяется). Итак, когда вы   начать процесс миграции, запущенный через drush, он просто запускается и   продолжает работать, пока это не закончится.

     

При запуске процессов через веб-интерфейс PHP   max_execution_time (обычно 30 секунд, если не меньше). Таким образом,   для длительных процессов нам необходимо использовать Batch API, который управляет   разбиение процесса на несколько запросов. Итак, миграция   процесс запускается, запускается в течение 25 секунд или около того, затем останавливается и   Пакетный API выдает новый запрос страницы, в котором процесс миграции   перезапускается, до бесконечности.

     

Итак, понимая, почему лучше Drush?

     

Это быстрее

     

Пакетный API вводит много накладных расходов - выключение и   повторное обращение к запросам страницы, процесс миграции должен выполняться   через все необходимые конструкторы снова, соединения с базой данных   восстановление и повторные запросы и т. д. И для частичного импорта это   необходимо подобрать место, где оно было остановлено - если первые 500 исходных записей   были импортированы, ему нужно найти 501-ю запись. В зависимости от   ваш исходный формат и способ его построения, это может быть или не масштабироваться - если   вы используете водяные знаки с источником SQL, сам запрос может   устранить предыдущие записи и начать с того места, где вы остановились. Если   нет, то Migrate необходимо прокрутить исходные данные, которые ищут   первая не импортированная запись. С, скажем, большим XML-файлом, как ваш   источник, после многих итераций он может занять больше времени, чем ваш   PHP max_execution_time, чтобы добраться туда, где вы можете забрать, и   миграция может останавливаться.

     

Более надежный

     

Запуск миграции через ваш браузер добавляет ваш рабочий стол и ваш   локальное подключение к Интернету, как точки отказа. Сбой сети, когда   Пакетный API переходит к следующему запросу страницы, сбою браузера,   случайное закрытие неправильной вкладки или окна может привести к прерыванию вашего   миграция. Запуск в drush уменьшает движущиеся части - вы устраняете   ваш рабочий стол и локальное интернет-соединение в качестве факторов.

     

Полезнее

     

Если что-то пойдет не так, если вы работаете в Drush, если есть какие-либо   полезные сообщения об ошибках, которые вы увидите. Ошибки с использованием Batch API   часто проглатываются, и все, что вы можете увидеть, это полностью   бесполезный "HTTP-запрос AJAX прерывается ненормально. Отладка   следует следующая информация. Путь: /batch? Id = 901 & op = do StatusText:   ResponseText: ReadyState: 4 ".

Вы можете найти более подробную информацию об этом здесь .

Тем временем, если вы хотите запустить пакет, даже если окно браузера закрыто, рассмотрите Фоновый процесс . Он имеет подмодуль Background Batch , который делает трюк.

  

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

ответил Mathankumar 21 32012vEurope/Moscow11bEurope/MoscowWed, 21 Nov 2012 13:04:45 +0400 2012, 13:04:45
0

Внимательно ознакомьтесь с пакетным API и эти модули помогут вы:

1- Прогеры Это попытка реализовать общую структуру для отслеживания любых прогресс

2- Фоновый прогресс берет на себя существующий пакетный API и запускает пакетные задания в фоновом режиме процес

ответил Mohammed Gomma 10 +03002017-10-10T08:32:46+03:00312017bEurope/MoscowTue, 10 Oct 2017 08:32:46 +0300 2017, 08:32:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132