我正在处理一个我无法编辑的第三方 PHP 库,它已经运行了将近一年。它用于simplexml_load_string
来自远程服务器的响应。最近它一直在大响应中窒息。这是房地产列表的数据馈送,格式如下所示:
<?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>
我下载了一个响应的示例文件(大约 22MB),这是我最终完成调试和理智的地方。两台服务器都运行 PHP 版本 5.3.8,但请注意不同的结果。我确信这两个文件是相同的(我想不同的文件大小、strlen 和最后 50 个字符可以通过具有额外回车符的 Windows 换行符来解释)。测试脚本:
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));
在 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>"
远程 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>"
对评论和附加信息的一些回复:
据我所知,XML 本身似乎是有效的(它确实在我的系统上工作)。
magic_quotes_runtime
绝对关闭。工作服务器具有 libxml 版本 2.7.7,而另一个具有 2.7.6。这真的能有所作为吗?我找不到 libxml 更改日志,但似乎不太可能。
这似乎只在响应/文件超过一定大小时发生,并且错误总是发生在倒数第二行。
我没有遇到内存问题,测试脚本会立即运行。
如果我知道哪些是相关的,我可以发布 PHP 配置的差异。知道问题可能是什么,或者知道我可能想检查的其他任何内容吗?