2010-01-04 12 views
1

我在不同的功能打开我的脚本一个10MB + XML文件多次:的DOMDocument ::负载在P​​HP 5

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

1)是老式加载文档上面?

我正在使用PHP 5.在静态地打开它 ?

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

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

感谢所有的帮助

回答

1

使用DOM解析器,整个XML文档加载在内存 - 一个大文件(我知道工作时,这可能会导致的问题,你可能穿上”吨有太多的选择)

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

  • 这意味着更多的工作,为PHP:它解析一个大的问题解决的文并且每次都会在内存中构建DOM树
  • 它可能需要更多的内存 - 理论上,当离开函数时,应该调用其析构函数,并释放内存,但是,谁知道...


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


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

如果是的话,如果你可以改变那种配置设置的,它可以帮助设置memory_limit到一个更高的价值。

+0

感谢您的信息!剧本刚刚死亡,没有任何警告没有任何警告。在apache中,httpd.exe进程达到250MB的内存使用量后,它会杀掉子进程。我认为它是一个内存泄漏,我需要关闭加载的文档。使用unset()可以吗? – Abs

+0

好吧,你可以尝试(PHP并不总是处理内存以及人们想要的),但我不确定它会有多大帮助:10 MB的XML意味着一个**大**文档,那就是不容易加载:-( –

+0

谢谢帕斯卡尔 - 我会尝试。:) – Abs

0

有DOM文档中的一个strong text concering内存泄漏。当我解析巨大的xml文件(90MB)时,我一行一行地读取文件并用调节表达式解析它。我知道这很丑陋,但它的工作内存不足。