Portál AbcLinuxu, 10. května 2025 01:05

Dotaz: XMLreader na větší objem s omezeným časem zpracování (hosting)

11.12.2013 20:32 cvp | skóre: 18
XMLreader na větší objem s omezeným časem zpracování (hosting)
Přečteno: 274×
Odpovědět | Admin
Mám hosting, kde lze mít spuštěný script maximálně 30 sekund, pak se objeví hláška 500. Zkouším načíst 25MB XML soubor, který si prvně uložím na FTP do složky a za pomocí XMLreader se snažím XML načíst. Bohužel se mě podaří načíst jen slabá 1/2.

Čekal jsem, že XMLreader má zabudované nějaké řazení, kdy když script skončí, začne opět tam kde skončil, aby se načetlo do mySQL celá data XML.
$reader = new XMLReader();
  $reader->open("../data.xml");
    while($reader->read())
    {
        if($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'SHOPITEM')
        {
          $doc = new DOMDocument('1.0', 'UTF-8');
          $data = simplexml_import_dom($doc->importNode($reader->expand(),true));

           // vypíšeme data, která se zapíší do mySQL          
           $id_id = $data->ID_PRODUCT;
           $kod = $data->KOD;
       }
     }
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Josef Kufner avatar 11.12.2013 22:35 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: XMLreader na větší objem s omezeným časem zpracování (hosting)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Proč vytváříš ten dokument uvnitř cyklu?

To co chceš je jednoduchý konečný automat, který bude zpracovávat události z ZML readeru a reagovat dle potřeby (nastavovat proměnné, ukládat data, když je záznam načten celý).

Zde na AbcLinuxu byl článek o gramatikách a parserech, to lze na to použít.
Hello world ! Segmentation fault (core dumped)
12.12.2013 10:43 Logik
Rozbalit Rozbalit vše Re: XMLreader na větší objem s omezeným časem zpracování (hosting)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Buďto tak jak naznačil předřečník (tj. proudovým zpracováním),

nebo by ještě mohlo bejt dostatečně rychlý použití simplexml a xpath, tj něco jako
foreach(simplexml::loadstring("../data.xml")->xpath('SHOPITEM') as $data) {
 $id_id = $data->ID_PRODUCT;
 $kod = $data->KOD;
}
Ty sis vybral nejhorší možnost - proudovej parser, kde pro každej element vytváříš spešl DOM a ten převádíš na simplexml - tj. s každym kouskem XML děláš spoustu vopičáren, pak to nemá běžet pomalu. V PHP je zásada - jazyk je to hroznej a pomalej, co můžeš nechat knihovnám, tak nech knihovnám.
Josef Kufner avatar 12.12.2013 11:20 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: XMLreader na větší objem s omezeným časem zpracování (hosting)
U tohoto je riziko, že na razí na omezení paměti, ale jinak je to také rozumný přístup.
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.