Zczytanie dużego pliku XML

0

Cześć wszystkim. Mam problem z pobraniem dużego XML'a z URL. Obecnie samo wywołanie zczytanie file_get_contents trwa ponad 120 sekund. new SimpleXmlElement to samo. Jak to zooptymalizować?

0

Jak dużego, przez sieć, czy lokalnie?

0

Na razie tylko ze środowiska lokalnego

0

A co potrzebujesz zrobić z tym XMLe?

0

Na serwerze działa szybciej :) Potrzebuje na ich podstawie importować produkty i aktualizować i szukam jak najszybszego sposobu. Porduktów może być nawet kilkaset tysięcy, odświeżanie raz dziennie

3

Podajesz mało szczegółów. Nikt nie wie, np. czy ten plik ma 300 MB czy 30 GB.

0

@Freja Draco: szacunkowo to ~ 3gb
@Mjuzik http://drib.tech/programming/parse-large-xml-files-php albo sobie googluj po "speed up parse xml php"
Jak się w czasie albo ramie nie mieścisz to ustaw set_time_limit / memory_limit

3

Nie ładuj całego pliku do pamięci tylko przetwarzaj sekwencyjnie:

https://www.php.net/manual/en/book.xmlreader.php

to wszystko na ten temat, możesz czytać godzinami różne artykuły ale do tego się to sprowadza: małe pliki można ładować całe do pamięci, duże należy przetwarzać sekwencyjnie, tag po tagu. W ten sposób tylko aktualnie przetwarzany element zajmuje miejsce w pamięci a nie cały plik, to znacznie przyspiesza prace i nie powoduje wywalania php np. powodu z braku pamięci.

0

Najpierw go musi pobrać i raczej tego chyba nie da się unikniesz. Potem można go jakimś SAX przejechać: https://www.tutorialspoint.com/php/php_sax_parser_example.htm

0

@hzmzp: Na razie mam zaimplementowany SimpleXML. Spróbuje użyć XMLReadera i sprawdzę efekty. Dzięki :)

1

Otwórz sobie plik bezpośrednio XML Readerem: $reader = XMLReader::open('https://....');, potem pętla i $reader->read(), potem jeżeli $reader->nodeType == XMLReader::ELEMENT, zmieniasz ten element w SimpleXMLElement $element = new SimpleXMLElement($reader->readOuterXML()); i robisz co trzeba na $element, tylko ten kawałek przetwarzany w pętli jest w pamięci, dzieki czemu wszystko mniej "muli

Geniuszu a jak poleci timeout z zew serwera albo go zbanuje z powodu zbyt długiego połączenia?

1 użytkowników online, w tym zalogowanych: 0, gości: 1