Пакет обработал все элементы, но вместо отображения сообщения о завершении я вижу ошибку «Разрешенный размер памяти 536870912 байт исчерпан».
Когда я отлаживаю код, я замечаю, что Drupal загружает каждый обработанный блок после пакетного завершения (ContentEntityBase->__construct
). Я не могу понять, почему Drupal это делает.
Структура кода:
Это пользовательский модуль с классом формы и пакетными функциями в custom_module.module
файл.При отправке формы модуль вызывает функцию создания пакета:
публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) {
custom_module_make_batch();
}
Функция custom_module_build_batch получает идентификаторы пользовательских блоков (4000 и более) и генерирует пакет:
функция custom_module_make_batch()
{
$ пакет = [];
$items = get_blocks_ids();
$batch = custom_module_generate_batch($items);
пакет_набор ($ пакет);
}
функция custom_module_generate_batch($items)
{
$операции = [];
$operations_groups = array_chunk($items, 50);
foreach ($operations_groups как $key => $operations_group) {
$операции[] = [
'пользовательский_модуль_batch_op',
[$операционная_группа],
];
}
$ партия = [
'операции' => $операции,
'finished' => 'custom_module_batch_finished',
'title' => 'Пользовательская партия',
'init_message' => 'Пакетная обработка начинается.',
'progress_message' => 'Обработано @current из @total частей.',
'error_message' => 'В пакете произошла ошибка.',
];
вернуть $пакет;
}
функция custom_module_batch_op($operations_group, &$context) {
foreach ($operations_group as $key => $bid) {
$block = \Drupal::service('entity.repository')->loadEntityByUuid('block_content', $bid);
$block->field_name = $new_value;
$блок->сохранить();
}
}
функция custom_module_batch_finished ($ успех, $ результаты, $ операции)
{
$messenger = \Drupal::messenger();
если ($ успех) {
// Здесь мы могли бы сделать что-то осмысленное с результатами.
// Мы просто отображаем количество обработанных узлов...
если (всего $) {
$messenger->addMessage(t('Обработано результатов @count.', ['@count' => $total]));
} еще {
$messenger->addMessage(t('Нет элементов для переноса'));
}
} еще {
// Произошла ошибка.
// $operations содержит операции, которые остались необработанными.
$ error_operation = сброс ($ операции);
$мессенджер->добавитьсообщение(
т(
'Произошла ошибка при обработке @operation с аргументами: @args',
[
'@operation' => $error_operation[0],
'@args' => print_r($error_operation[0], ИСТИНА),
]
)
);
}
}