Import 10 000 produktów przez panel admina kończył się błędem Allowed memory size exhausted po około 3000 produktach. Import trwał 40 minut i nie kończył się sukcesem. Czas naprawy: 3 godziny.
Objawy
PHP Fatal error: Allowed memory size of 536870912 bytes exhausted- Import przez UI przerywa się w połowie
- Import przez CLI (
bin/magento import:run) kończy się błędem po kilku tysiącach rekordów - Pamięć RAM serwera nie jest wyczerpana – problem tylko w procesie PHP
Diagnoza
# Sprawdź obecny memory limit
php -i | grep memory_limit
bin/magento dev:di:info Magento\ImportExport\Model\Import
# Monitoruj pamięć podczas importu
watch -n 1 "ps aux | grep php | grep -v grep | awk '{print \$6/1024 "MB"}'"
# Włącz garbage collector PHP (wyłączony domyślnie w długich procesach)
php -dzend.enable_gc=1 bin/magento import:run
Przyczyna
Moduł importu ładował wszystkie produkty do pamięci przed zapisem. Przy 10 000 produktach z wieloma atrybutami EAV każdy produkt zajmował ~50KB w pamięci = ~500MB tylko na dane. Dodatkowe obiekty Magento (registry, event system) zwiększały zużycie 3-krotnie.
Rozwiązanie
# Tymczasowe: zwiększ memory limit dla CLI # php.ini lub /etc/php/8.4/cli/php.ini: # memory_limit = 4G # Lub w środowisku: php -dmemory_limit=4G bin/magento import:run --entity=catalog_product --behavior=append -- import_file=/var/www/html/var/import/products.csv
<?php
// Właściwe rozwiązanie: import w batchach z czyszczeniem pamięci
class BatchImporter
{
private const BATCH_SIZE = 500;
public function import(string $csvPath): void
{
$handle = fopen($csvPath, 'r');
$header = fgetcsv($handle);
$batch = [];
while (($row = fgetcsv($handle)) !== false) {
$batch[] = array_combine($header, $row);
if (count($batch) >= self::BATCH_SIZE) {
$this->processBatch($batch);
$batch = [];
// Zwolnij pamięć
gc_collect_cycles();
$this->objectManager->get(\Magento\Framework\Registry::class)->_reset();
}
}
if (!empty($batch)) {
$this->processBatch($batch);
}
fclose($handle);
}
}
Wynik
Import 10 000 produktów: z 40 minut (nieukończone) do 8 minut (zakończone). Zużycie pamięci: stabilne na poziomie 256MB przez cały import.
