【问题标题】:DOMDocument::load in PHP 5PHP 5 中的 DOMDocument::load
【发布时间】:2011-01-01 06:32:21
【问题描述】:

我在我的脚本中以不同的功能多次打开一个 10MB 以上的 XML 文件:

$dom = DOMDocument::load( $file ) or die('couldnt open');

1) 以上是加载文档的旧样式吗?

我正在使用 PHP 5。打开它 静态的?

2) 如果可能,我是否需要关闭 XML 文件的加载?

我怀疑它会导致内存问题,因为我循环遍历 XML 文件的节点数千次,有时我的脚本会突然结束。

感谢大家的帮助

【问题讨论】:

    标签: php xml memory-leaks loops


    【解决方案1】:

    使用 DOM 解析器,整个 XML 文档被加载到内存中——这可能会在处理大文档时导致问题(我知道,您可能没有太多选择)

    首先,我会尽量不要多次打开同一个文档:

    • 这意味着 PHP 需要做更多的工作:它必须多次解析一个大文档,并且每次都在内存中构建 DOM 树
    • 它可能需要更多内存 -- 理论上,当您离开实例化 DOMDocument 对象的函数时,应该调用其析构函数并释放内存,但是,谁知道...


    关于“上面是加载文档的旧样式”,好吧,看DOMDocument::load的文档,似乎可以动态调用它(见示例) 和静态 (参见返回值部分) ;所以,我想这两种解决方案都可以,没有“旧方式”也没有“新方式”。


    我的脚本突然结束”是什么意思?你有关于memory_limit 的致命错误吗?

    如果是,如果您可以更改这种配置设置,将memory_limit 设置为更高的值可能会有所帮助。

    【讨论】:

    • 感谢您提供的信息!脚本就这样死了,没有任何警告,什么也没有。在 apache 中,它只是在 httpd.exe 进程达到 250MB 的 RAM 使用量后杀死子进程。我认为这是内存泄漏,我需要关闭加载的文档。只使用 unset() 可以吗?
    • 嗯,你可以试试(PHP 并不总是像人们想要的那样处理内存),但我不确定它会不会有多大帮助:10 MB 的 XML 意味着一个 big 文档,加载起来并不容易 :-(
    • 谢谢帕斯卡 - 我会试试的。 :)
    • @Abs :我也在尝试解析大于 250 MB 的 xml 文件。有没有办法增加这个 250 的限制?
    【解决方案2】:

    strong text 涉及 DOMDocument 中的内存泄漏。当我解析巨大的 xml 文件(90MB)时,我使用逐行读取文件并用正则表达式解析它。我知道这很难看,但它在内存非常低的情况下也能正常工作。

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 2012-05-10
      • 2010-09-18
      • 1970-01-01
      • 2014-06-22
      • 2012-01-10
      • 2013-06-16
      • 2011-02-20
      相关资源
      最近更新 更多