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ć?
Jak dużego, przez sieć, czy lokalnie?
Na razie tylko ze środowiska lokalnego
A co potrzebujesz zrobić z tym XMLe?
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
Podajesz mało szczegółów. Nikt nie wie, np. czy ten plik ma 300 MB czy 30 GB.
@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
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.
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
@hzmzp: Na razie mam zaimplementowany SimpleXML. Spróbuje użyć XMLReadera i sprawdzę efekty. Dzięki :)
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?