140 likes | 277 Views
PHP & XML. Performace – pravdy a lži Michal Vrchota @techi602. NEPOUŽÍVEJTE VŠUDE DOM. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Přístupy pro práci s XML. NÁHODNÝ. SEKVENČNÍ. Načte celý dokument Může skákat Vyšší spotřeba paměti
E N D
PHP & XML Performace – pravdy a lži Michal Vrchota @techi602
NEPOUŽÍVEJTE VŠUDE DOM 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Přístupy pro práci s XML NÁHODNÝ SEKVENČNÍ Načte celý dokument Může skákat Vyšší spotřeba paměti Podpora Xpath a XSLT DOMDocument SimpleXML Čte postupně Nemůže skákat Nižší spotřeba paměti Vyšší rychlost XmlReader XmlWriter SAX
DOM je ukecaný <book> <title>Catcher in the rye</title> <author>J. D. Salinger</author> </book> DOM $xml = new DomDocument(); $xml->load('book.xml'); echo $xml->getElementsByTagName('title')->item(0)->textContent; SimpleXml $xml = simplexml_load_file('book.xml'); echo $xml->title;
DOM je nenažraný DOM XmlWriter <SHOPITEM> <PRODUCT>Pivo</PRODUCT> ... </SHOPITEM> Generování 100MB XML Spotřeba paměti 450MB Čas 25 sec Generování 100MB XML Spotřeba paměti 4MB Čas 4 sec $shopItem = $dom->createElement('SHOPITEM'); $product = $dom->createElement('PRODUCT'); $product->appendChild( $dom->createTextNode($name)); $shopItem->appendChild($product); $xmlWriter->startElement('SHOPITEM'); $xmlWriter->writeElement('PRODUCT', $name); ... $xmlWriter->endElement();
Čtení velkých XML Katalog obsahující 100 000 produktů (100MB) <Katalog> <Produkt>9780007198207</Produkt> <Popis>Twilight Children</Popis> <Katalogove_cislo>0007198205</Katalogove_cislo> ... </Katalog> <Katalog> <Produkt>9780007198894</Produkt> <Popis>IF YOU COULD SEE ME NOW</Popis> <Katalogove_cislo>0007198892</Katalogove_cislo> <Carovy_kod>9780007198894</Carovy_kod> ...
XmlReader • Pull model • $xml = new XmlReader(); • $xml->read() • $xml->nodeType (typ uzlu – element, atribut, koncový element) • $xml->name (hodnota elementu, atributu, komentáře)
XmlReader $xml = new XmlReader(); $xml->open($filename); $element = 'Katalog'; while ($xml->read()) { if ($xml->nodeType == XmlReader::END_ELEMENT && $xml->name == $element && $xml->depth == 1) { print_r($data); $data = array(); } if ($xml->nodeType == XmlReader::ELEMENT) { $tag = $xml->name; } if ($xml->nodeType == XmlReader::TEXT) { $data[$tag] = $xml->value; } }
Nenačítejte vše do paměti ŠPATNĚ SPRÁVNĚ 10 000 řádků v databázi Spotřeba 30 MB Čas 8 sec 10 000 řádků v databázi Spotřeba 0.1 MB Čas 0.3 sec $data = $db->fetchAll($select); foreach ($data as $item) { $this->process($item); } $stmt = $db->query($select); while ($item = $stmt->fetch()) { $this->process($item); }
Stahování souborů přes HTTP file_get_contents() - čtení do paměti fopen() , fsockopen() - číst po částech, chunky... CURL – mnoho kódu a konfigurace Zend_Http_Client (ZF >= 1.10) $client = new Zend_Http_Client(); $client->setUri('http://www.example.com/big.xml'); $client->setStream($filename); $response = $client->request(Zend_Http_Client::GET);
One more thing... „XML is like violence. If it doesn't solve your problem, you're not using enough of it.“