Como usar XMLReader / DOMDocument com grande arquivo XML e evitar 500 erros

Eu tenho um arquivo XML que é aproximadamente 12mb que tem cerca de 16000 produtos. Eu preciso processá-lo em um database; No entanto, em cerca de 6000 linhas, ele morre com um erro de 500. Estou usando o framework Kohana (versão 3) apenas no caso de ter algo a ver com isso.

Aqui está o meu código que eu tenho dentro do controlador:

$xml = new XMLReader(); $xml->open("path/to/file.xml"); $doc = new DOMDocument; // Skip ahead to the first  while ($xml->read() && $xml->name !== 'product'); // Loop through 's while ($xml->name == 'product') { $node = simplexml_import_dom($doc->importNode($xml->expand(), true)); // 2 queries to database put here $xml->next('product'); } 

O XML é um conjunto de itens para uma loja, então as duas consultas são a) insert ignore a própria loja e b) inserir o produto

Qualquer percepção seria muito apreciada.

Provavelmente você está sem memory. Tente aumentar o limite de memory

ini_set('memory_limit','128M');

ou qualquer que seja a quantidade de memory necessária (depende do seu servidor). Deixo aqui alguns links para outras formas de aumentar o limite de memory do seu servidor:

PHP: aumenta o limite de memory

PHP: aumenta o limite de memory 2

Por que você está misturando XMLReader / DomDocument? Basta usar XMLReader:

 $reader = new XMLReader(); // initialize $reader->open( 'file.xml' ); // open file do { $sxe = simplexml_load_string( $reader->readOuterXml() ); // get current element echo $sxe; // echo current element } while( $reader->next( $this->type ) ); // repeat this for any "product" tag 

A vantagem do exemplo acima é que o XMLReader somente lê a tag atual na memory. O DomDocument lê o arquivo inteiro – é por isso que você recebe o erro 500. Com o exemplo dado, você pode lidar com arquivos XML com centenas de MB, sem aumentar o limite de memory (exceto a tag atual que você tenta ler é maior que a memory disponível).

Intereting Posts