【问题标题】:Php memory limit issue while scraping huge file抓取大文件时的PHP内存限制问题
【发布时间】: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


【解决方案1】:

找到了一个更好的方法:这里不需要 DOM,我只需将 str_replace 填充到 file_get_contents 返回的字符串中,然后将其放入另一个带有 file_put_contents 的文件中。简洁明快:

$xml = file_get_contents('HugeFile.xml'); 
$new = str_replace('text to replace','new text',$xml);
file_put_contents('output.xml');    

而preg_replace 可能会为复杂的修改派上用场。

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 2023-03-28
    • 2017-12-06
    • 2011-05-21
    • 1970-01-01
    • 2023-03-29
    • 2011-02-18
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多