Пакетные операции в Друпал, использование Batch API и почему он не работает
При реализации различного функционала в Друпал может понадобиться сделать выполнение долгих операций. Такими операциями может быть все что угодно, например, массовое обновление данных у материалов, пользователей, импорт данных и т.д. Все это правильно называется пакетные операции Друпал. Для их корректного выполнения предусмотрено специальное API.
Выполнение долгих или больших операций можно реализовать по-разному. Можно написать код таким образом, что всё будет выполнено за один запрос, но здесь нужно учесть время выполнение кода PHP, чтобы оно не превысило установленные пределы. В противном случае код остановится с ошибкой, операция прервется. Нужно смотреть на параметры конкретного сервера, на одном могут возникнуть проблемы, на другом все отлично выполнится.
Оптимальным вариантом при разработке проекта на Друпал будет использование Batch. Эта технология позволяет разбивать длинные операции на несколько небольших и выполнять каждую в отдельном запросе, что снимает ограничения на время выполнения скрипта PHP. Batch может выполнять операции и в одном запросе - он самостоятельно распределяет задачи и составляет для них отдельные запросы лишь в случае, если их время выполнения больше 1 секунды.
Как использовать Batch в Друпал? Batch больше относится к Form API, поэтому оптимально вызывать его из формы Друпал. Но можно и из любого места в коде, для этого нужно дописать дополнительную строчку кода.
function mymodule_myfunction() {
$operations = array();
// Выборка материалов
$result = db_select('node', 'n')->fields('n', array('nid'))->execute();
foreach ($result as $row) {
$operations[] = array('mymodule_change_date', array($row->nid));
}
// Параметры Batch
$batch = array(
'operations' => $operations,
'finished' => 'mymodule_batch_finished',
'title' => 'Выполнение операции',
'init_message' => 'Пожалуйста подождите',
'progress_message' => 'Выполнено @current из @total',
'error_message' => 'Произошла ошибка',
// Если функции находятся в другом файле, нужно обязательно это указать, иначе Batch не работает
'file' => drupal_get_path('module', 'mymodule').'/mymodule.inc',
);
// Запуск Batch
batch_set($batch);
// Необходимо писать, если код вызывается не из Form API
batch_process();
}
function mymodule_change_date($nid) {
$node = node_load($nid);
$node->created = time();
node_save($node);
}
function mymodule_batch_finished($success, $results, $operations) {
if ($success) {
drupal_set_message('Операция успешно выполнена');
} else {
drupal_set_message('Завершено с ошибками', 'error');
}
}
Как видно, код для запуска Batch в Друпал совсем прост. В начале подготавливаются данные, например, делается выборка материалов из базы данных и в цикле делается заполнение массива операций. Указывается имя функции и параметр, в который передается nid. Далее настраивается и запускается сам Batch функцией batch_set. Наконец, пишутся функции обработки и завершения операций.
Но бывают случаи, когда Batch не работает. Если он вызывается не из Form API – обязательно нужно вызвать функцию batch_process, она запустит индикатор выполнения. Крайне важно помнить, если функции находятся в другом файле, нужно обязательно указать этот файл, при помощи ключа file, как показано в примере.
Таким образом, мы рассмотрели, как использовать пакетные операции в Друпал, а именно использование Batch API. Пример поможет начинающим разработчикам начать применять эту технологию. Если Batch не работает, обратите внимание на указанные выше возможные причины.
Последние статьи
- 03.04.24ИТ / Уроки PHP Уроки простыми словами. Урок 3. Все операторы PHP с примерами, с выводом работы кода на экран.
- 02.04.24ИТ / Уроки PHP Уроки простыми словами. Урок 2. Типы данных в PHP с примерами.
- 02.04.24ИТ / Уроки PHP Уроки простыми словами. Урок 1. Коротко о языке веб-программирования PHP. Основы синтаксиса.
- 09.11.23ИТ / Базы данных Ошибки при переходе с MySQL 5.6 на 5.7 и как их исправить - импорт дампа БД завершился ошибкой или не работает INSERT. Отключение строгого режима STRICT_TRANS_TABLES или использование IGNORE
- 08.07.22ИТ / Разное Конвертация офисных файлов DOC, DOCX, DOCM, RTF в форматы DOCX, DOCM, DOC, RTF, PDF, HTML, XML, TXT без потерь и изменения разметки