【发布时间】:2016-02-02 20:56:03
【问题描述】:
我正在使用 Simple Html Dom 抓取这个巨大的 xml 文件(300k 行 ~ 11MB),并且遇到了一些内存限制问题。所以我添加了一些 php.ini 命令来覆盖默认设置并启用对内存的完全控制。坏主意。
我的代码:
include('simple_html_dom.php');
ini_set('memory_limit', '-1');
ini_set('max_execution_time', '-1');
$xml = file_get_contents('HugeFile.xml');
$xml2 = new simple_html_dom();
$xml2->load($xml);
foreach($xml2->find('tag1') as $element) {
$element->innertext = str_replace('text to replace','new text',$element>innertext);
}
$html->save('output'.xml');
}
现在,有没有办法让这个脚本在合理的时间内顺利运行而没有任何内存问题? 这可以使用文本编辑器轻松完成,但我需要将其自动化,因为我有很多文件要编辑。
【问题讨论】:
-
好吧,要么获得更大的包(具有更高的内存限制),要么将文件分成更小的部分。逐块读取可能无济于事,因为您需要在遍历字段时准备好 DOM。
-
难道没有任何 php 函数可以在给定的迭代次数内释放循环内使用的内存吗?
-
如果您正在运行 PHP FPM -- 一些 ini_set 调用将被忽略。
-
使用像XMLReader这样的拉解析器?
-
如果可能,我会推荐使用外部 XML 解析器,你不需要增加 PHP 的内存限制。
标签: php xml apache memory-limit