Przejdź do głównej treści
Grafika przedstawia ukryty obrazek

Streaming XML w PHP – efektywne przetwarzanie dużych plików XML

Streaming XML w PHP – efektywne przetwarzanie dużych plików XML

XML (eXtensible Markup Language) od lat jest jednym ze standardowych formatów do przechowywania i przesyłania danych. Jednakże, w pracy z bardzo dużymi plikami XML – rzędu setek megabajtów lub więcej – tradycyjne metody przetwarzania, takie jak wczytywanie całego dokumentu do pamięci (np. przy użyciu DOMDocument), mogą prowadzić do wyczerpania zasobów serwera. Rozwiązaniem jest streaming XML, czyli przetwarzanie dokumentu "w locie", fragment po fragmencie.

W tym artykule przyjrzymy się, czym jest streaming XML w PHP i jak praktycznie z niego korzystać.

Dlaczego warto stosować streaming XML?

  • Oszczędność pamięci – nie wczytujemy całego pliku do RAM-u.
  • Wydajność – szybkie przetwarzanie dużych zbiorów danych.
  • Możliwość obsługi bardzo dużych plików – ograniczenia pamięci przestają być problemem.

Narzędzia do streamingu XML w PHP

PHP oferuje kilka rozsądnych sposobów do strumieniowego przetwarzania XML:

1. XMLReader

XMLReader to jedna z najbardziej wydajnych i niskopoziomowych klas do czytania XML w PHP. Działa podobnie do kursora: przemieszcza się po węzłach dokumentu jeden po drugim.

Podstawowy przykład użycia:

$reader = new XMLReader();
$reader->open('duzy_plik.xml');

while ($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'produkt') {
        echo "Znaleziono element produkt:\n";

        // Można odczytać atrybuty
        if ($reader->hasAttributes) {
            while ($reader->moveToNextAttribute()) {
                echo $reader->name . " = " . $reader->value . "\n";
            }
            $reader->moveToElement(); // powrót do elementu
        }
    }
}

$reader->close();

Co robi ten kod?

  • Otwiera plik XML.
  • Iteruje po każdym elemencie.
  • Wypisuje informacje o elementach <produkt> i ich atrybutach.

2. SimpleXML + XMLReader

Jeśli chcesz wygodniejszy dostęp do danych niż oferuje XMLReader, możesz połączyć jego wydajność ze strukturą SimpleXML.

Przykład:

$reader = new XMLReader();
$reader->open('duzy_plik.xml');

while ($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'produkt') {
        $node = new SimpleXMLElement($reader->readOuterXML());

        echo "Nazwa produktu: " . $node->nazwa . "\n";
        echo "Cena: " . $node->cena . "\n";
    }
}

$reader->close();

Dlaczego to dobre podejście?

  • XMLReader zapewnia oszczędność pamięci.
  • SimpleXML daje łatwy dostęp do danych w formie obiektowej.

3. SAX Parser (xml_set_element_handler)

Starsze i mniej wygodne podejście, ale wciąż dostępne: SAX (Simple API for XML). PHP umożliwia ustawianie funkcji-callbacków na zdarzenia takie jak otwarcie elementu, zamknięcie elementu, czy odczytanie tekstu.

Prosty przykład SAX:

function startElement($parser, $name, $attrs) {
    if ($name == 'PRODUKT') {
        echo "Start elementu PRODUKT\n";
    }
}

function endElement($parser, $name) {
    if ($name == 'PRODUKT') {
        echo "Koniec elementu PRODUKT\n";
    }
}

$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");

$fp = fopen("duzy_plik.xml", "r");
while ($data = fread($fp, 4096)) {
    xml_parse($parser, $data, feof($fp)) or
        die(sprintf("XML Error: %s at line %d",
            xml_error_string(xml_get_error_code($parser)),
            xml_get_current_line_number($parser)));
}

xml_parser_free($parser);
fclose($fp);

Kiedy którego podejścia używać?

Narzędzie Kiedy wybrać
XMLReader Najlepszy wybór przy dużych plikach i prostym przetwarzaniu.
XMLReader + SimpleXML Gdy potrzebujesz łatwego dostępu do danych w drzewie.
SAX (xml_set_element_handler) Gdy chcesz pełną kontrolę nad każdym zdarzeniem i minimalne zużycie pamięci, ale kosztem czytelności kodu.

Przykładowy plik XML: produkty.xml

<?xml version="1.0" encoding="UTF-8"?>
<produkty>
    <produkt id="1">
        <nazwa>Smartfon XYZ</nazwa>
        <cena>1999.99</cena>
        <opis>Nowoczesny smartfon z dużym ekranem i potrójnym aparatem.</opis>
    </produkt>
    <produkt id="2">
        <nazwa>Laptop ABC</nazwa>
        <cena>3499.00</cena>
        <opis>Lekki laptop do pracy biurowej i rozrywki.</opis>
    </produkt>
    <produkt id="3">
        <nazwa>Słuchawki DEF</nazwa>
        <cena>299.99</cena>
        <opis>Bezprzewodowe słuchawki z aktywną redukcją szumów.</opis>
    </produkt>
</produkty>

Jak ten XML pasuje do naszych przykładów?

  • Każdy <produkt> posiada:
    • Atrybut id.
    • Pod-elementy: <nazwa>, <cena>, <opis>.
  • Całość opakowana w korzeń <produkty>, co jest dobrą praktyką.

Krótki przykład czytania tego XML-a z wcześniejszym kodem

Za pomocą XMLReader + SimpleXML:

$reader = new XMLReader();
$reader->open('produkty.xml');

while ($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'produkt') {
        $node = new SimpleXMLElement($reader->readOuterXML());

        echo "ID: " . (string) $node['id'] . "\n";
        echo "Nazwa: " . (string) $node->nazwa . "\n";
        echo "Cena: " . (float) $node->cena . " PLN\n";
        echo "Opis: " . (string) $node->opis . "\n";
        echo "-----------------------------\n";
    }
}

$reader->close();

Efekt działania:

ID: 1
Nazwa: Smartfon XYZ
Cena: 1999.99 PLN
Opis: Nowoczesny smartfon z dużym ekranem i potrójnym aparatem.
-----------------------------
ID: 2
Nazwa: Laptop ABC
Cena: 3499 PLN
Opis: Lekki laptop do pracy biurowej i rozrywki.
-----------------------------
ID: 3
Nazwa: Słuchawki DEF
Cena: 299.99 PLN
Opis: Bezprzewodowe słuchawki z aktywną redukcją szumów.
-----------------------------

Podsumowanie

Streaming XML w PHP to nie tylko kwestia optymalizacji, ale często konieczność przy pracy z dużymi danymi. Dzięki klasie XMLReader lub parserom opartym na zdarzeniach, możemy efektywnie i bezpiecznie przetwarzać nawet gigabajtowe pliki XML.

Jeśli więc Twój serwer zaczyna się dusić przy analizie dużych plików XML – czas przejść na strumieniowe przetwarzanie!

28 kwietnia 2025 15

Kategorie

programowanie

Tagi

php xml

Dziękujemy!
()

Powiązane wpisy


Informacja o cookies

Moja strona internetowa wykorzystuje wyłącznie niezbędne pliki cookies, które są wymagane do jej prawidłowego działania. Nie używam ciasteczek w celach marketingowych ani analitycznych. Korzystając z mojej strony, wyrażasz zgodę na stosowanie tych plików. Możesz dowiedzieć się więcej w mojej polityce prywatności.