加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP垃圾收集很糟糕还是仅仅是我?

发布时间:2020-12-13 18:24:15 所属栏目:PHP教程 来源:网络整理
导读:我有一个下面的函数,我在循环中经常调用. 随着内存从1MB上升到156MB,我等了5分钟. PHP的garabage收集器不应该出现并在某些时候减少它吗?! 是因为我将内存限制设置为256MB? 在回波点2,3,4,它的内存使用量相当不变.它在第4点下降了半个兆位.但第1点是主内存
我有一个下面的函数,我在循环中经常调用.

随着内存从1MB上升到156MB,我等了5分钟. PHP的garabage收集器不应该出现并在某些时候减少它吗?!

是因为我将内存限制设置为256MB?

在回波点2,3,4,它的内存使用量相当不变.它在第4点下降了半个兆位.但第1点是主内存增加发生的地方.可能是因为file_get_html在内存中加载了html文件.

我虽然变量$html的清晰和未设置会解决这个问题吗?

function get_stuff($link,$category ){

    $html = file_get_html(trim("$link"));

    $article = $html->find('div[class=searchresultsWidget]',0);

    echo '1 - > '.convert(memory_get_usage(true)).'<br />';  

    foreach($article->find('h4 a') as $link){

        $next_url = 'http://new.mysite.com'.$link->href;

        $font_name = trim($link->plaintext);        

        $html = file_get_html(trim("$next_url"));

        $article = $html->find('form[class=addtags]',0);

        $font_tags = '';

        foreach($article->find('ul[class=everyone_tags] li a span') as $link){

            $font_tags .= trim($link->innertext).',';   

        }

        echo '2 - > '.convert(memory_get_usage(true)).'<br />'; 

        $font_name = mysql_real_escape_string($font_name);
        $category =  mysql_real_escape_string($category);  
        $font_tags = mysql_real_escape_string($font_tags);  

        $sql = "INSERT INTO tag_data (font_name,category,tags) VALUES ('$font_name','$category','$font_tags')";

        unset($font_tags);
        unset($font_name);
        unset($category); 

        $html->clear();   

        mysql_query($sql); 

        unset($sql);   

        echo '3 - > '.convert(memory_get_usage(true)).'<br />';    

} 

    unset($next_url);
    unset($link);
    $html->clear(); 
    unset($html);   
    unset($article);

    echo '4 - > '.convert(memory_get_usage(true)).'<br />';

}

正如你所看到的,我试图无力地利用未设置的东西.虽然我的理解并不好,但一旦我称它就不会“取消”记忆.

感谢大家帮助我如何减少记忆力的上升.

file_get_html(): http://simplehtmldom.sourceforge.net/manual_faq.htm#memory_leak存在已知的内存泄漏

解决方案是使用

$html->clear();

你在做什么,但是:你在循环的内部和外部使用$html.在循环内部,您调用$html-> clear(),然后在函数结束时再接近$html-> clear()(我假设抓住您的初始file_get_html()对象引用).最后一次通话没有做任何事情.你正在使用最初的$html = file_get_html()调用泄漏内存.

尝试在循环中使用不同的变量($html1,也许?),看看会发生什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读