大文件上的php – simplexml_load_string错误发生在一个系统上,但不是另一个

前端之家收集整理的这篇文章主要介绍了大文件上的php – simplexml_load_string错误发生在一个系统上,但不是另一个前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在处理一个我无法编辑的第三方 PHP库,它已经运行了将近一年.它对远程服务器的响应使用simplexml_load_string.最近,它一直在阻止大量的回应.这是房地产列表的数据Feed,格式如下所示:
  1. <?xml version="1.0"?>
  2. <RETS ReplyCode="0" ReplyText="Operation Successful Reference ID: 9bac803e-b507-49b7-ac7c-d8e8e3f3aa89">
  3. <COUNT Records="9506" />
  4. <DELIMITER value="09" />
  5. <COLUMNS> sysid 1 2 3 4 5 6 </COLUMNS>
  6. <DATA> 252370080 Residential 0.160 No ADDR0 06051</DATA>
  7. <DATA> 252370081 Residential 0.440 Yes ADDR0 06043</DATA>
  8. <DATA> 252370082 Residential 1.010 No ADDR0 06023</DATA>
  9. <DATA>More tab delimited text</DATA>
  10. <!-- snip 9000+ lines -->
  11. </RETS>

我下载了一个响应的示例文件(大约22MB),这里我结束了我的调试和理智.两台服务器都运行PHP 5.3.8版,但请注意不同的结果.我确定,我可以这两个文件是一样的(我认为不同的文件大小,strlen,最后50个字符可以解释由Windows换行符额外的回车字符).测试脚本:

  1. error_reporting(-1);
  2. ini_set('display_errors',1);
  3. $file = 'error-example.xml';
  4. $xml = file_get_contents($file);
  5.  
  6. echo 'filesize: ';
  7. var_dump(filesize($file));
  8.  
  9. echo 'strlen: ';
  10. var_dump(strlen($xml));
  11.  
  12. echo 'simplexml object? ';
  13. var_dump(is_object(simplexml_load_string($xml)));
  14.  
  15. echo 'Last 50 characters: ';
  16. var_dump(substr($xml,-50));

在Windows上本地输出

  1. filesize: int(21893604)
  2. strlen: int(21893604)
  3. simplexml object? bool(true)
  4. Last 50 characters: string(50) "RD DR CT Watertown 203-555-5555 </DATA>
  5. </RETS>"

远程UNIX服务器上的输出

  1. filesize: int(21884093)
  2. strlen: int(21884093)
  3. simplexml object?
  4. Warning: simplexml_load_string(): Entity: line 9511: parser error : internal error in /path/to/test.PHP on line 19
  5.  
  6. 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
  7.  
  8. Warning: simplexml_load_string(): ^ in /path/to/test.PHP on line 19
  9.  
  10. 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
  11.  
  12. Warning: simplexml_load_string(): AULTED CEILING IN FOYER,NEW FLOORING IN LR DR FR FOYER KITCHEN in /path/to/test.PHP on line 19
  13.  
  14. Warning: simplexml_load_string(): ^ in /path/to/test.PHP on line 19
  15. bool(false)
  16. Last 50 characters: string(50) "ORD DR CT Watertown 203-555-5555 </DATA>
  17. </RETS>"

一些回复评论和附加信息:

> XML本身似乎是有效的,只要我能告诉(它在我的系统上工作).
> magic_quotes_runtime绝对是关闭的.
>工作服务器具有libxml版本2.7.7,而另一个具有2.7.6.真的可以有所作为吗?我找不到一个libxml更改日志,但似乎不太可能.
>这似乎只发生在响应/文件超过一定大小时,错误总是发生在下一个最后一行.
>我没有遇到内存问题,测试脚本会立即运行.

如果我知道哪些相关的PHP配置有差异,我可以发布.任何想法可能是什么问题,还是知道其他什么我可能想检查?

libxml2 changelog包含 “608773 add a missing check in xmlGROW (Daniel Veillard)”,这似乎与输入缓冲有关.注意我不了解libxml2内部的任何内容,但似乎可以想象,您已经在2.7.7中修复了一个2.7.6的错误.

当您直接使用simplexml_load_file()时,检查行为是否有所不同,并尝试设置libxml解析器相关选项,例如.

  1. simplexml_load_string($xml,'SimpleXMLElement',LIBXML_COMPACT | LIBXML_PARSEHUGE)

具体来说,您可能需要尝试LIBXML_PARSEHUGE标志.

07002
XML_PARSE_HUGE flag 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.

猜你在找的PHP相关文章