SIMPLE HTML DOM内存泄漏

时间:2014-01-17 14:54:14

标签: php simple-html-dom

我有一个使用simple_html_dom的脚本。

foreach ($urls as $url)
    {
       $html = file_get_html($url);

        if($html->innertext!=''){

            foreach($html->find('.doc div[style="padding-top:1px;border-bottom:1px solid #eaeaec;padding-bottom:6px;"]') as $b){
                $b->style='""';
                echo $b;
            }           
            }
        $html->clear();
        unset($html); 
    }

运行此脚本时出现以下错误:

  

致命错误:允许的内存大小为444596224字节(尝试分配1272字节)。

3 个答案:

答案 0 :(得分:2)

  问:这个脚本严重泄漏内存......完成后   正在运行,它没有正确地从内存中清理dom对象..

     答:由于php5循环引用内存泄漏,创建DOM后   对象,如果调用,你必须调用$ dom-> clear()来释放内存   file_get_dom()多一次。

     

示例:

$html = file_get_html(...); 
// do something... 
$html->clear(); 
unset($html);

从他们的常见问题解答中找到: http://simplehtmldom.sourceforge.net/manual_faq.htm

答案 1 :(得分:0)

如果您仍想解析此文件

您可以将php.ini的memory_limit设置得更高或使用以下代码。

ini_set('memory_limit', '128M');

或优化您的代码:(当发现时,发布它)

    $finder = $html->find('.doc div[style="..."]');

    foreach($finder as $index => $b){
        /* do something here */
        $finder[$index]->clear();
    }
    $html->clear();

也许你可以使用REGEX删除或获得你需要的东西

答案 2 :(得分:0)

修复问题需要替换此功能,

function clear(){
    $this->dom = null;
    $this->parent = null;
    $this->parent = null;
    $this->children = null;
}

就此:

function clear(){
    unset($this->dom);
    unset($this->parent);
    unset($this->parent);
    unset($this->children);
}