PHP - Фатална грешка: Разрешеният размер на паметта от 268435456 байта е изчерпан

Фатална грешка: Разрешеният размер на паметта от 268435456 байта е изчерпан.

Инсталирах PHP 5.3 версия и добавих gc_collect_cycles();

където е необходимо.

Работя с PHP проста библиотека dom с голям брой URL адреси (уебсайтове), за да ги проверя дали са добри (проверява за iframe и вградени тагове в HTML, дали има iframe или вградени тагове с SRC атрибут, различен от youtube, metacafe или dailymotion ще маркира URL като НЕдобър.

Уебсайтовете са мои (не изтривам никого).

Защо има изтичане на памет, ако методът clear(), null, unset и gc_collect_cycles се извиква всеки път в края на цикъла.

   foreach ($data as $blog) {
         $htm = file_get_html($blog['blogurl']);

         if ($htm->find('iframe', 0)) {

        foreach ($htm->find('iframe') as $if) {
          if (! preg_match('/(dailymotion\.com|metacafe\.com|youtube\.com)/i', @ $if->src)) {
            //this URL i
            mark_url_not_good($blog['blogurl']);

            $htm->clear();
            $htm = null;
            unset($htm);
            gc_collect_cycles();
            continue 2;
          }
        }



      }
            $htm->clear();
            $htm = null;
            unset($htm);
            gc_collect_cycles();


     }

person BetterMan21    schedule 12.04.2012    source източник
comment
Свързвате ли се с база данни като част от вашия скрипт?   -  person Wandering Digital    schedule 12.04.2012
comment
Връзката се извършва 1 път ПРЕДИ цикъла.   -  person BetterMan21    schedule 12.04.2012
comment
Трябва да публикувате още подробности или опростена версия на вашия код.   -  person Eli    schedule 12.04.2012
comment
@user1316394 можете да въведете символа @ и след това да въведете първите няколко букви от името на хората, на които искате да отговорите, трябва да се покаже поле - щракнете върху това, за да вмъкнете автоматично името им във вашия коментар, уверете се, че другите са уведомени за твоят коментар. +1 за добавяне на вашия код.   -  person Ozzy    schedule 20.04.2012


Отговори (2)


Защо има изтичане на памет, ако методът clear(), null, unset и gc_collect_cycles се извиква всеки път в края на цикъла.

Е, може да има просто изтичане на памет вътре в простата библиотека dom, събирането на боклука няма да поправи това. Без да виждате кода си, е трудно да дадете предложения какво е най-добре да направите в тази ситуация.

Може да искате да замените функцията за скрейп с по-роден парсер като DOMDocument.

person hakre    schedule 12.04.2012
comment
Кодът извлича URL адреси от базата данни и ги зацикля. в цикъла се създава нов обект на проста библиотека dom в началото на цикъла за обработка на HTML. - person BetterMan21; 12.04.2012
comment
@user1316394 Добре, така че това прави. Как го прави? Трябва да видим вашия код. - person MetalFrog; 12.04.2012

това, от което наистина се нуждаете, е:

$htm->__destruct();

за да изчистите паметта на simple_html_dom всеки път, когато вече не се нуждаете от $htm информацията. напр. използвайте това, където имате:

$htm->clear();

Обърнете внимание на двойното подчертаване!

person Dr Nick Engerer    schedule 29.08.2012