Lô đã xử lý tất cả các mục, nhưng thay vì hiển thị thông báo kết thúc, tôi thấy lỗi "Đã hết dung lượng bộ nhớ cho phép là 536870912 byte".
Khi tôi gỡ lỗi mã, tôi nhận thấy rằng Drupal tải từng khối đã xử lý khi kết thúc hàng loạt (ContentEntityBase->__construct
). Tôi không thể hiểu tại sao Drupal lại làm như vậy.
Cấu trúc của mã:
Đây là một mô-đun tùy chỉnh với lớp biểu mẫu và các hàm hàng loạt trong custom_module.module
tập tin.Khi gửi biểu mẫu, mô-đun gọi hàm tạo hàng loạt:
hàm công khai submitForm(mảng &$form, FormStateInterface $form_state) {
custom_module_make_batch();
}
Hàm custom_module_build_batch nhận id của các khối tùy chỉnh (4000 trở lên) và tạo lô:
hàm custom_module_make_batch()
{
$batch = [];
$items = get_blocks_ids();
$batch = custom_module_generate_batch($items);
batch_set($batch);
}
hàm custom_module_generate_batch($items)
{
hoạt động $ = [];
$operations_groups = array_chunk($items, 50);
foreach ($operations_groups dưới dạng $key => $operations_group) {
$ Operations[] = [
'custom_module_batch_op',
[$operations_group],
];
}
$đợt = [
'hoạt động' => $hoạt động,
'đã hoàn tất' => 'custom_module_batch_finished',
'tiêu đề' => 'Lô tùy chỉnh',
'init_message' => 'Đợt đang bắt đầu.',
'progress_message' => 'Đã xử lý @current trên @total phần.',
'error_message' => 'Hàng loạt gặp lỗi.',
];
trả lại lô hàng $;
}
function 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;
$block->save();
}
}
chức năng custom_module_batch_finished($success, $results, $operations)
{
$messenger = \Drupal::messenger();
nếu ($ thành công) {
// Ở đây chúng ta có thể làm điều gì đó có ý nghĩa với kết quả.
// Chúng tôi chỉ hiển thị số lượng nút mà chúng tôi đã xử lý...
nếu ($tổng) {
$messenger->addMessage(t('@count kết quả đã xử lý.', ['@count' => $total]));
} khác {
$messenger->addMessage(t('Không có mục nào để di chuyển'));
}
} khác {
// Đã xảy ra lỗi.
// $operations chứa các hoạt động chưa được xử lý.
$error_operation = đặt lại($operations);
$messenger->addMessage(
t(
'Đã xảy ra lỗi khi xử lý @operation với các đối số : @args',
[
'@operation' => $error_operation[0],
'@args' => print_r($error_operation[0], TRUE),
]
)
);
}
}