LibXML Memory allocation failed : growing buffer

Funzionava tutto a meraviglia e poi...traaac!

Contesto: tramite cURL l'applicazione scarica un listino di un fornitore in formato XML, per poi importarlo all'interno del database.
La lettura dei dati avviene tramite simplexml_load_string().

Da un momento all'altro ci siamo accorti che il listino non veniva più scaricato ed è quindi iniziato il debug.
Il problema è stato riscontrato proprio per la funzione simplexml_load_string(), con questo messaggio di errore:

[0] => LibXMLError Object
(
 [level] => 3
 [code] => 2
 [column] => 0
 [message] => Memory allocation failed : growing buffer
 [file] =>
 [line] => 0
.....

Di RAM nel server ce n'è in abbondanza, quindi non poteva essere consumata tutta da un file da 130MB.

Il blocco è dovuto a un'impostazione di PHP/simplexml che limita la dimensione massima del contenuto di cui eseguire il parsing.
Questo è facilmente aggirabile (a patto di avere sufficiente RAM) utilizzando il flag LIBXML_PARSEHUGE.
Dal manuale PHP:

LIBXML_PARSEHUGE (int)
Sets XML_PARSE_HUGE flag, which relaxes any hardcoded limit from the parser. This affects limits like maximum depth of a document or the entity recursion, as well as limits of the size of text nodes.

Nella pratica si utilizza in questo modo:

$xml = simplexml_load_string($curl_result, "SimpleXMLElement", LIBXML_PARSEHUGE);

 


Commenti