我在使用 xml_parse 时遇到了一个奇怪的错误。我的脚本通过 xml_parse 函数在 XML 文件的最后一行返回“无内存”错误。仅当文件大小大于 10Mb 时才会发生这种情况。少一点是可以接受的。但我有 3Gb 可用于 PHP 脚本,总内存为 32Gb。
该脚本曾经在另一台服务器上工作时工作(PHP 为 2Gb,总共为 16Gb),并且它可以处理更大的文件。但它是 FreeBSD,现在它在 CentOS 6.4 下。
可能有人有同样的情况吗?
我在使用 xml_parse 时遇到了一个奇怪的错误。我的脚本通过 xml_parse 函数在 XML 文件的最后一行返回“无内存”错误。仅当文件大小大于 10Mb 时才会发生这种情况。少一点是可以接受的。但我有 3Gb 可用于 PHP 脚本,总内存为 32Gb。
该脚本曾经在另一台服务器上工作时工作(PHP 为 2Gb,总共为 16Gb),并且它可以处理更大的文件。但它是 FreeBSD,现在它在 CentOS 6.4 下。
可能有人有同样的情况吗?
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));
}
}
问题通过降级 libxml 得到解决。由于我们的框架——Symfony 1.4,我们需要使用 PHP 5.2.17,而 libxml 是最后一个版本。降级后一切正常。
显然,有一个更好的答案,如XML_PARSE_HUGE on function simplexml_load_string()所述
您需要设置常量 LIBXML_PARSEHUGE 以绕过限制:
$xmlDoc->loadXML( $xml , LIBXML_PARSEHUGE );
感谢 @Vaclav Kohout 提供此使用说明。