Analisando arquivos XML grandes usando PHP

Eu me deparei com uma situação em que precisei analisar um grande arquivo XML (1 GB) para extrair os dados em uma tabela MySQL. Como de costume, fiz minha rodada inicial de pesquisa. Primeiro, decidi usar a classe DOMDocument PHP .

Primeiro erro

Para meu teste, usei um pequeno subconjunto de dados … pesando míseros 24 registros.

Inicialmente, todos os meus testes funcionaram muito bem. Então eu decidi jogar o arquivo XML completo (1 GB) nele. Fracasso épico … Quer dizer, funcionou bem por um tempo, mas acabou ficando sem memória. (E, sim … eu aumentei o limite de memória * para 1,5 GB e o tempo máximo de execução * para 5 horas.) Eu temia que isso pudesse acontecer.

O problema de utilizar DOMDocument em arquivos XML grandes é que ele carrega os dados em uma matriz. Durante a análise, essa matriz está crescendo. Não é bom quando você está lidando com arquivos XML enormes.

Com essa falha em meu currículo, voltei para a prancheta. Conhecimento é poder … conhecimento é poder … conhecimento é poder.

Meu próximo passo

XMLReader . Do site PHP: ”A extensão XMLReader é um analisador XML Pull. O leitor atua como um cursor avançando no fluxo do documento e parando em cada nó no caminho. ” OK, parece muito mais promissor .

E a pesquisa diz, Ding!

$file = "PATH_TO_FILE";
$reader
= new XMLReader();
$reader
->open($file);
while( $reader->read() ) {
// Execute processing here
}
$reader
->close();

Depois disso, era molho. Bem, além da lógica adicional que tinha que ir para isso. Esse é facilmente um tópico próprio.

* Como modificar o ” limite de memória ” e o “tempo máximo de execução” do PHP por script

// Tweak some PHP configurations
ini_set
('memory_limit','1536M'); // 1.5 GB
ini_set
('max_execution_time', 18000); // 5 hours