Php simplexml_load_大文件上的字符串错误发生在一个系统上,而不是另一个系统上

Php simplexml_load_大文件上的字符串错误发生在一个系统上,而不是另一个系统上,php,xml,simplexml,Php,Xml,Simplexml,我正在处理一个我无法编辑的第三方PHP库,它已经正常工作了将近一年。它对来自远程服务器的响应使用simplexml\u load\u string。最近,它一直被大量的回应所扼杀。这是房地产清单的数据源,格式如下: <?xml version="1.0"?> <RETS ReplyCode="0" ReplyText="Operation Successful Reference ID: 9bac803e-b507-49b7-ac7c-d8e8e3f3aa89"> <

我正在处理一个我无法编辑的第三方PHP库,它已经正常工作了将近一年。它对来自远程服务器的响应使用
simplexml\u load\u 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>
在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>"
filesize:int(21893604)
strlen:int(21893604)
simplexml对象?布尔(真)
最后50个字符:字符串(50)“RD DR CT Watertown 203-555-5555
"
远程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>"
filesize:int(21884093)
斯特伦:国际(21884093)
simplexml对象?
警告:simplexml_load_string():实体:第9511行:解析器错误:第19行的/path/to/test.php中存在内部错误
警告:simplexml_load_string():门厅天花板有故障,FR中有砖FP,LR DR FR门厅厨房中有新地板,第19行的/path/to/test.php
警告:simplexml_load_string():^in/path/to/test.php,第19行
警告:simplexml_load_string():实体:第9511行:解析器错误:第19行的/path/to/test.php中文档末尾有额外内容
警告:simplexml_load_string():门厅天花板有故障,FR中有砖FP,LR DR FR门厅厨房中有新地板,第19行的/path/to/test.php
警告:simplexml_load_string():^in/path/to/test.php,第19行
布尔(假)
最后50个字符:字符串(50)“作战需求文件CT沃特敦203-555-5555
"
对评论和其他信息的一些答复:

  • 据我所知,XML本身似乎是有效的(它在我的系统上也能工作)

  • magic\u quotes\u运行时
    绝对关闭

  • 工作服务器的libxml版本为2.7.7,而另一个服务器的libxml版本为2.7.6。这真的会有区别吗?我找不到libxml更改日志,但似乎不太可能

  • 这似乎只有在响应/文件超过一定大小时才会发生,并且错误总是发生在下一行的最后一行

  • 我没有遇到内存问题,测试脚本会立即运行

如果我知道哪些PHP配置是相关的,我可以发布它们之间的差异。是否知道问题可能是什么,或者是否知道我可能要检查的任何其他内容?

内容,似乎与输入缓冲有关。注意,我对libxml2的内部结构一无所知,但可以想象的是,您在2.7.7中修复了一个2.7.6错误

直接使用
simplexml\u load\u file()
时,请检查行为是否有任何不同,并尝试设置与libxml解析器相关的选项,例如

simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_PARSEHUGE)
具体来说,您可能需要尝试
LIBXML\u
标志


XML\u PARSE\u hug
标志放松解析器的任何硬编码限制。这会影响文档或实体递归的最大深度等限制,以及文本节点大小的限制


您的XML无效,在这两种情况下都会导致问题

您只需要有一个根

即,所有内容都应在标签内:

<?xml version="1.0"?>
<RETS>
    ...
</RETS>

...
XML中有多个根,这将导致问题:-)

尝试将其全部包装到根节点中,看看是否有效

<?xml version="1.0"?>
<rootNode>
    <RETS>
    ...
    </RETS>
    <count bla="99" />
</rootNode>

...

我不确定是libxml中的差异,还是允许它处理其中一个而不是另一个的错误报告级别不同,但这在我看来是个问题。

My XMLSpy确认您的XML文件(我从您提供的链接下载的)没有问题并且格式良好

然而,一个潜在的问题是XML前言中缺少“encoding”属性:根据您的libxml2版本,我想可能会出现以下情况: 服务器检查编码属性,若缺少该属性,服务器将返回到某个默认值(配置设置)。可能较旧的库版本不检查BOM表

另请参见此链接,他们在libxml中也有类似的编码问题:

其本质是,对libxml库进行升级确实可以解决这个问题。或者,可能值得检查配置中的默认编码设置

根据我的XMLSpy,该文件是utf-8编码的——作为测试,如果指定

<?xml version="1.0" encoding="UTF-8"?>


由于文件序言阻止了Unix服务器阻塞。

只是猜测:如果设置了
magic\u quotes\u runtime
,您可以执行
$xml=stripslashes($xml)执行
后,获取文件内容(…)
可能是
错误报告
显示错误
。另外,请检查
内存\u限制
,因为听起来您的脚本可能会超过默认限制。此外,即使您收到不同的错误消息,但这两个问题看起来都是一样的,所以我倾向于使用无效的xml文件。@neelsg我对其中一个没有任何问题,所以我不知道你可能是什么意思?这些系统中有一个运行32位libs,另一个运行64位libs吗?今晚我会看一下这个答案和你的评论(我现在忙得不可开交),非常感谢你的回复,很抱歉我很匆忙/疏忽。所有迹象似乎都表明我们需要升级libxml。据我所知,我认为我们需要重新编译PHP。很抱歉没有注意到这篇文章,我还有其他事情要做。首先,我要尝试降低本地libxml的级别,看看是否可以重现错误。哦,伙计,
libxml\u
就是这样!我不知道怎么做,但我之前错过了。谢谢,再次为太空箱感到抱歉。不值得
<?xml version="1.0" encoding="UTF-8"?>