【问题标题】:xml_parse No memory error PHPxml_parse 无内存错误 PHP
【发布时间】:2013-10-09 18:18:54
【问题描述】:

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

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

可能有人有同样的情况?

【问题讨论】:

    标签: php memory xml-parsing centos


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在 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));
          }
      }
      

      【讨论】:

      • 如果您在字符串中有输入并且需要将其拆分为片段以提供给xml_parse() 请注意substr() 可能会返回布尔值 false 而不是 PHP 版本低于 8.0 的空字符串!
      【解决方案3】:

      显然,这里有一个更好的答案XML_PARSE_HUGE on function simplexml_load_string()

      你需要设置常量 LIBXML_PARSEHUGE 来绕过限制:

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

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

      【讨论】:

      • 不知道为什么这被否决了,因为它是较新版本 PHP 的正确答案.....
      猜你喜欢
      • 2015-11-21
      • 1970-01-01
      • 2018-06-23
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      相关资源
      最近更新 更多