Веб-разработка, логотип Websash

Пакетные операции в Друпал, использование Batch API и почему он не работает

При реализации различного функционала в Друпал может понадобиться сделать выполнение долгих операций. Такими операциями может быть все что угодно, например, массовое обновление данных у материалов, пользователей, импорт данных и т.д. Все это правильно называется пакетные операции Друпал. Для их корректного выполнения предусмотрено специальное API.

batch-api-process

Выполнение долгих или больших операций можно реализовать по-разному. Можно написать код таким образом, что всё будет выполнено за один запрос, но здесь нужно учесть время выполнение кода 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 не работает, обратите внимание на указанные выше возможные причины.

Оставить заявку

Последние статьи

Популярные разделы