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