Import i eksport dużych plików w PHP

Grafika: Import i eksport duzych plikow w

Wprowadzenie

Podczas jednej z realizacji stanęliśmy przed wyzwaniem: system miał umożliwiać import i eksport dużych zbiorów dokumentów. Na pierwszy rzut oka – brzmi prosto. Ale kiedy pierwsze testy poszły w ruch, okazało się, że nasze pliki rosły do setek megabajtów, a PHP z gracją wyświetlał komunikat o przekroczonej pamięci (Allowed memory size exhausted).

Problem

Wersja 1.0 zakładała, że wszystkie dokumenty będą ładowane do pamięci jednocześnie. Brzmiało to logicznie: wczytać, przetworzyć i wyeksportować.
Jednak przy plikach zawierających tysiące dokumentów okazało się to katastrofą. PHP (które standardowo ma ograniczenie pamięci do 128 MB lub 256 MB) po prostu nie radził sobie z takim obciążeniem.

Efekt? Proces importu kończył się w połowie, a eksport wyłączał serwer.

Rozwiązanie

Po krótkiej burzy mózgów zdecydowaliśmy się na chunkowanie danych – czyli dzielenie dużego pliku na mniejsze porcje. Optymalnym wyborem okazało się 200 dokumentów w jednej paczce.

Dzięki temu:

  • procesy importu i eksportu stały się stabilne,
  • pamięć PHP przestała być wąskim gardłem,
  • system mógł przetwarzać dowolnie duże pliki – wystarczyło rozbić je na porcje.

Przykładowa implementacja

Oto uproszczony fragment kodu w PHP, pokazujący jak wyglądało dzielenie dokumentów na paczki po 200 elementów:


$documents = loadDocumentsFromFile($filePath);
$chunkSize = 200;

$chunks = array_chunk($documents, $chunkSize);

foreach ($chunks as $index => $chunk) {
    processDocuments($chunk);
    echo "Przetworzono paczkę nr " . ($index + 1) . "\n";
}

Dzięki temu zamiast jednorazowego wczytania np. 5000 dokumentów, system wykonywał 25 mniejszych kroków, a pamięć była wykorzystywana w granicach rozsądku.

Ciekawostki (Fun facts)

  • Pierwsza wersja eksportu działała tak długo, że jeden z developerów zdążył… zaparzyć kawę, wypić i zrobić drugą rundę zanim proces się skończył ☕.
  • Zmiana logiki na chunkowanie skróciła czas eksportu o ponad 60% – mniejsze porcje oznaczały także szybsze zwalnianie pamięci.
  • W praktyce użytkownik nawet nie zauważa, że plik jest dzielony – cały proces wygląda tak, jakby był ciągły.

Efekt końcowy

Po wprowadzeniu chunkowania:

  • system stał się stabilny nawet dla plików o rozmiarze kilkuset MB,
  • zniknęły błędy pamięci,
  • klienci mogli w końcu bez problemu migrować swoje dokumenty między systemami.

Chcesz wdrożyć podobne rozwiązanie w swojej firmie?

Przekładamy wiedzę z bloga na konkretne działania biznesowe: analizę, wdrożenie i rozwój. Sprawdź usługę i zobacz, jak możemy pomóc także u Ciebie.

Kompleksowa obsługa informatyczna

administrator

Leave A Comment