Сборка "мусора" PHP сосет или является этим просто меня?

У меня есть функция, ниже которой я звоню очень часто в цикл.

Я ожидал 5 минут как память, по которой взбираются от 1 МБ до 156 МБ. garabage коллектор PHP Should't поднимается и уменьшает это в какой-то момент?!

Это, потому что у меня есть предел памяти аппарата на уровне 256 МБ?

В эхе указывают на 2,3,4 его довольно постоянных использования памяти. Это спускается по моей половине meg в точке 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 />';

}

Как Вы видите, я попытался использовать сброс слабо. Хотя его отрицательный результат насколько я понимаю не "сбросит" память, как только я называю ее.

Спасибо все для любой справки о том, как я могу уменьшить это восходящее повышение памяти.

7
задан Abs 1 August 2010 в 17:57
поделиться

3 ответа

Известная утечка памяти с 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?) Внутри вашего цикла и посмотрите, что произойдет.

8
ответ дан 6 December 2019 в 19:31
поделиться

Сборщик мусора предназначен исключительно для отлова круговых ссылок.

Если их нет, переменные немедленно удаляются, как только количество их ссылок достигнет 0.

Я не рекомендую вам использовать unset, кроме исключительных случаев. Вместо этого используйте функции и полагайтесь на то, что переменные выйдут из области видимости и память будет восстановлена.

Кроме этого, мы не можем описать вам, что именно происходит, потому что нам нужно точно знать, что делает простой парсер DOM. Возможно, есть циклические ссылки или глобальные ресурсы, удерживающие ссылку, но это было бы трудно узнать.

См. основы подсчета ссылок и сбор циклов.

3
ответ дан 6 December 2019 в 19:31
поделиться

PHP не имел надлежащего сборщика мусора до версии 5.3 . В основном он использовал только подсчет ссылок, который оставлял бы циклические ссылки на месте до завершения скрипта (например, $ a = & $ a является циклическим). Кроме того, код очистки, который он DID имел, будет запускаться только в том случае, если этого требует нехватка памяти. например нет смысла выполнять дорогостоящий цикл очистки, если только что освобожденная память не нужна.

Начиная с версии 5.3, существует надлежащий сборщик мусора, и вы можете принудительно запустить его с помощью gc_enable () и gc_collect_cycles () .

2
ответ дан 6 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: