2

我在使用 xml_parse 时遇到了一个奇怪的错误。我的脚本通过 xml_parse 函数在 XML 文件的最后一行返回“无内存”错误。仅当文件大小大于 10Mb 时才会发生这种情况。少一点是可以接受的。但我有 3Gb 可用于 PHP 脚本,总内存为 32Gb。

该脚本曾经在另一台服务器上工作时工作(PHP 为 2Gb,总共为 16Gb),并且它可以处理更大的文件。但它是 FreeBSD,现在它在 CentOS 6.4 下。

可能有人有同样的情况吗?

4

3 回答 3

7

libxml "LIBXML_PARSEHUGE" 中有硬编码限制,请查看http://php.net/manual/en/libxml.constants.php了解详情。

但是您不需要降级 libxml。只需更改调用 xml_parse 的方式即可。

例如,对于超过 10MB 的文件,这种方式不起作用:

$fileContent = file_get_contents("/tmp/myFile.xml");
if (!xml_parse($this->xmlParser, $fileContent, true))
{
    $xmlErreurString = xml_error_string(xml_get_error_code($xmlParser));
}

但是,如果您将文件 5 x 5MB 读取,就可以了:

$xmlParser = xml_parser_create();
$fp = fopen("/tmp/myFile.xml", "r");
while($fileContent = fread($fp, 1024*1024*5))
{
    if (!xml_parse($xmlParser, $fileContent, feof($fp)))
    {
        $xmlErreurString = xml_error_string(xml_get_error_code($xmlParser));
    }
}
于 2017-01-05T17:18:51.860 回答
0

问题通过降级 libxml 得到解决。由于我们的框架——Symfony 1.4,我们需要使用 PHP 5.2.17,而 libxml 是最后一个版本。降级后一切正常。

于 2013-10-04T15:37:48.710 回答
0

显然,有一个更好的答案,如XML_PARSE_HUGE on function simplexml_load_string()所述

您需要设置常量 LIBXML_PARSEHUGE 以绕过限制:

$xmlDoc->loadXML( $xml , LIBXML_PARSEHUGE );

感谢 @Vaclav Kohout 提供此使用说明。

于 2017-11-28T17:54:15.850 回答