MiniXml(php)无法解析大于100k的文件

时间:2009-03-30 04:36:00

标签: php xml

我正从Web服务检索XML,然后将其加载到MiniXml(PHP)中。当文件小于100k时,它解析得很好。更大,我收到一个错误:

  

在非对象

上调用成员函数getElement()

当我尝试从根元素中获取第一个元素时,会发生这种情况。

$parsedDoc = new MiniXMLDoc();
$parsedDoc->fromString($xml);
$root =& $parsedDoc->getElement('my-root-element');
$lists =& $root->getElement($type);

我调用的Web服务允许我指定要调用的顶级元素的数量。大小超过100k的最后一个元素形成良好,完全没有任何问题。我唯一能想到的是尺寸。在这种情况下,尺寸是否重要?

更新:我认为这是一个缓冲区问题,但我不知道哪个缓冲区导致了问题。我确信它不是“Web服务调用”,因为我知道它正在检索所有数据。它是PHP缓冲区还是MiniXml缓冲区引起的问题?或者它完全是另一回事? (感谢Dan指出这一点)

2 个答案:

答案 0 :(得分:6)

我遇到了与我谈到的when converting HTML to PDF完全相同的事情。

This bug描述了这个问题。 PHP 5.2.x引入了一个新参数pcre.backtrack_limit,默认值为100,000。基本上,自PHP 5.2 以来,任何preg_ *函数都会在大于100k的字符串上静默失败。顺便说一句,bug mentioend仍然是开放的。没有采取任何措施。

限制太低。如果你有选择将它提升到2,000,000(或任何你需要的)。如果这不是一个选项 - 它可能不在共享托管环境中 - 那么你就遇到了问题。

当我找到它时,我真的无法相信这一个。这种改变不仅打破了大量的模板代码(因为许多线程,错误报告和对上述所有内容的评论都会证明)但是没有引发错误(除非您碰巧看到preg_last_error(),让我们面对它,大多数人别)。

答案 1 :(得分:0)

我对PHP知之甚少,对MiniXml一无所知,但是我想到的是,你可能有一个大于< = 100K的输入缓冲区,所以当它被输入MiniXML时,close标签就会丢失。文档中的顶级元素。 (这与你引用的最后元素是否形成不同有关。)