Los errores de simplexml_load_string en archivos grandes ocurren en un sistema pero no en otro
Estoy tratando con una biblioteca de PHP de terceros que no puedo editar, y ha estado funcionando bien durante casi un año. Usasimplexml_load_string
en la respuesta de un servidor remoto. Últimamente se ha estado ahogando en grandes respuestas. Esta es una fuente de datos para listados de bienes raíces, y el formato es similar al siguiente:
<?xml version="1.0"?>
<RETS ReplyCode="0" ReplyText="Operation Successful Reference ID: 9bac803e-b507-49b7-ac7c-d8e8e3f3aa89">
<COUNT Records="9506" />
<DELIMITER value="09" />
<COLUMNS> sysid 1 2 3 4 5 6 </COLUMNS>
<DATA> 252370080 Residential 0.160 No ADDR0 06051</DATA>
<DATA> 252370081 Residential 0.440 Yes ADDR0 06043</DATA>
<DATA> 252370082 Residential 1.010 No ADDR0 06023</DATA>
<DATA>More tab delimited text</DATA>
<!-- snip 9000+ lines -->
</RETS>
Descargué un archivo de muestra de una respuesta (aproximadamente 22 MB), aquí es donde terminé con mi depuración y cordura. Ambos servidores ejecutan la versión 5.3.8 de PHP, pero tenga en cuenta los diferentes resultados. Estoy seguro de que ambos archivos son iguales (supongo que los diferentes tamaños de archivo, strlen y los últimos 50 caracteres pueden explicarse por las nuevas líneas de Windows que tienen un carácter de retorno de carro adicional). Guión de prueba:
error_reporting(-1);
ini_set('display_errors', 1);
$file = 'error-example.xml';
$xml = file_get_contents($file);
echo 'filesize: ';
var_dump(filesize($file));
echo 'strlen: ';
var_dump(strlen($xml));
echo 'simplexml object? ';
var_dump(is_object(simplexml_load_string($xml)));
echo 'Last 50 characters: ';
var_dump(substr($xml, -50));
Salida localmente en Windows:
filesize: int(21893604)
strlen: int(21893604)
simplexml object? bool(true)
Last 50 characters: string(50) "RD DR CT Watertown 203-555-5555 </DATA>
</RETS>"
Salida en servidor remoto UNIX:
filesize: int(21884093)
strlen: int(21884093)
simplexml object?
Warning: simplexml_load_string(): Entity: line 9511: parser error : internal error in /path/to/test.php on line 19
Warning: simplexml_load_string(): AULTED CEILING IN FOYER, BRICK FP IN FR, NEW FLOORING IN LR DR FR FOYER KITCHEN in /path/to/test.php on line 19
Warning: simplexml_load_string(): ^ in /path/to/test.php on line 19
Warning: simplexml_load_string(): Entity: line 9511: parser error : Extra content at the end of the document in /path/to/test.php on line 19
Warning: simplexml_load_string(): AULTED CEILING IN FOYER, BRICK FP IN FR, NEW FLOORING IN LR DR FR FOYER KITCHEN in /path/to/test.php on line 19
Warning: simplexml_load_string(): ^ in /path/to/test.php on line 19
bool(false)
Last 50 characters: string(50) "ORD DR CT Watertown 203-555-5555 </DATA>
</RETS>"
Algunas respuestas a comentarios e información adicional:
El XML en sí mismo parece ser válido por lo que puedo decir (yhace trabajar en mi sistema).
magic_quotes_runtime
está definitivamente apagado
El servidor de trabajo tiene libxml Versión 2.7.7, mientras que el otro tiene 2.7.6. ¿Podría eso realmente hacer la diferencia? No pude encontrar un registro de cambios de libxml pero parece poco probable.
Esto parece ocurrir solo cuando la respuesta / el archivo tiene un tamaño determinado, y el error siempre ocurre en la línea siguiente a la última.
No estoy teniendo problemas de memoria, el script de prueba se ejecuta instantáneamente.
Hay diferencias en las configuraciones de PHP que puedo publicar si supiera cuáles son relevantes. ¿Alguna idea de cuál podría ser el problema, o sabe algo más que quiera verificar?