Lotul a procesat toate articolele, dar în loc să afișeze mesajul de finalizare, văd eroarea „Dimensiunea memoriei permisă de 536870912 octeți epuizat”.
Când depanez codul, observ că Drupal încarcă fiecare bloc procesat la terminarea lotului (ContentEntityBase->__construct
). Nu pot să-mi dau seama de ce Drupal face asta.
Structura codului:
Acesta este un modul personalizat cu clasă de formular și funcții batch în modul_personalizat.modul
fişier.La trimiterea formularului, modulul apelează funcția de creare a lotului:
funcția publică submitForm(matrice &$form, FormStateInterface $form_state) {
custom_module_make_batch();
}
Funcția custom_module_build_batch obține ID-urile blocurilor personalizate (4000 sau mai multe) și generează lotul:
funcția custom_module_make_batch()
{
$lot = [];
$items = get_blocks_ids();
$lot = custom_module_generate_batch($articole);
set_loturi($lot);
}
funcția custom_module_generate_batch($items)
{
$operatii = [];
$grupuri_operații = array_chunk($articole, 50);
foreach ($operations_groups ca $key => $operations_group) {
$operațiuni[] = [
„custom_module_batch_op”,
[$operations_group],
];
}
$lot = [
'operations' => $operatii,
'finished' => 'custom_module_batch_finished',
'title' => 'Lot personalizat',
'init_message' => 'Lotul începe.',
'progress_message' => 'Procesat @current din @total părți.',
'error_message' => 'Lotul a întâmpinat o eroare.',
];
returnează $lot;
}
funcția custom_module_batch_op($operations_group, &$context) {
foreach ($operations_group ca $key => $bid) {
$block = \Drupal::service('entity.repository')->loadEntityByUuid('block_content', $bid);
$block->field_name = $new_value;
$bloc->salvare();
}
}
funcția custom_module_batch_finished($succes, $rezultate, $operations)
{
$messenger = \Drupal::messenger();
dacă ($succes) {
// Aici am putea face ceva semnificativ cu rezultatele.
// Afișăm doar numărul de noduri procesate...
dacă ($total) {
$messenger->addMessage(t('@count rezultate procesate.', ['@count' => $total]));
} altfel {
$messenger->addMessage(t('Nu există articole pentru migrare'));
}
} altfel {
// A aparut o eroare.
// $operations conține operațiunile care au rămas neprocesate.
$operațiune_eroare = resetare($operații);
$messenger->addMessage(
t(
„A apărut o eroare la procesarea @operation cu argumente: @args”,
[
'@operation' => $error_operation[0],
'@args' => print_r($error_operation[0], TRUE),
]
)
);
}
}