Ciao a tutti.
Devo implementare una soluzione per importare nel mio database 100000 record (o più). Questi record mi vengono passati tramite un file XML ogni settimana. Vorrei gestire questa importazione tramite PHP (alla peggio passerò a perl), ma ho seri problemi di gestione.
Per leggere il file XML utilizzo la classe DOMDocument, e il codice che uso è lo stesso suggerito nella descrizione del metodo DOMDocument::getElementsByTagName su php.net.
Questo è il codice che uso:
Questo è il mio file users.xml:Codice PHP:<?php
ini_set("max_execution_time", 1200);
ini_set("memory_limit","100M");
echo "[list=1]";
$doc = new DOMDocument();
$doc->load( 'users.xml' );
$dataset = $doc->getElementsByTagName( "dataUser" );
foreach( $dataset as $row )
{
$xmlUserNames = $row->getElementsByTagName( "UserName" );
$xmlUserName = $xmlUserNames->item(0)->nodeValue;
$xmlEmails = $row->getElementsByTagName( "Email" );
$xmlEmail = $xmlEmails->item(0)->nodeValue;
$xmlDisplayNames = $row->getElementsByTagName( "DisplayName" );
$xmlDisplayName = $xmlDisplayNames->item(0)->nodeValue;
$xmlTelephones = $row->getElementsByTagName( "Telephone" );
$xmlTelephone = $xmlTelephones->item(0)->nodeValue;
$xmlMobiles = $row->getElementsByTagName( "Mobile" );
$xmlMobile = $xmlMobiles->item(0)->nodeValue;
$xmlFaxes = $row->getElementsByTagName( "Fax" );
$xmlFax = $xmlFaxes->item(0)->nodeValue;
echo "[*]"."$xmlUserName - $xmlEmail - $xmlDisplayName - $xmlTelephone - $xmlMobile - $xmlFax"."";
}
echo "[/list]";
?>
Il problema qual è: la procedura è lentissima! Se aggiungo altri elementi indicativamente leggo un nodo al secondo, e più avanzo nel file più rallenta.Codice PHP:<?xml version="1.0" encoding="UTF-8"?>
<NewDataSet>
<dataUser>
<UserName>User1</UserName>
<Email>user1@mail.com</Email>
<Telephone>01234567</Telephone>
<Mobile>987654321</Mobile>
<Fax>123456789</Fax>
<DisplayName>UserOne</DisplayName>
</dataUser>
<dataUser>
<UserName>User2</UserName>
<Email>user2@mail.eu</Email>
<Telephone>01234567</Telephone>
<Mobile>987654321</Mobile>
<Fax>123456789</Fax>
<DisplayName>UserTwo</DisplayName>
</dataUser>
<dataUser>
<UserName>User3</UserName>
<Email>user3@mail.net</Email>
<Telephone>01234567</Telephone>
<Mobile>987654321</Mobile>
<Fax>123456789</Fax>
<DisplayName>UserThree</DisplayName>
</dataUser>
<dataUser>
...
</dataUser>
</NewDataSet>
Qui un esempio (il file sul quale lavoro ha 20 elementi in più a nodo).
Come posso velocizzare la lettura dell'XML? Suppongo che il problema risieda nella memoria utilizzata.
Grazie anticipatamente. ;-)

Rispondi quotando