2

致命的なエラー: 268435456 バイトの許容メモリ サイズを使い果たしました。

PHP 5.3 バージョンをインストールし、gc_collect_cycles(); を追加しました。

必要な場所。

私はPHPの単純なDOMライブラリを多数のURL(Webサイト)で使用して、それらが適切かどうかを確認しています(YouTube、metacafeとは異なるSRC属性を持つiframeまたはembedタグがある場合、HTMLにiframeタグとembedタグがあるかどうかをチェックします)または、dailymotion は URL に NOT GOOD のフラグを立てます。

Web サイトは私のものです (誰もスクレイピングしていません)。

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();


     }
4

2 に答える 2

2

clear() メソッド、null、unset、および gc_collect_cycles がループの最後で毎回呼び出されるとメモリ リークが発生するのはなぜですか。

まあ、単純な dom ライブラリ内でメモリ リークが発生している可能性がありますが、ガベージ コレクションではそれは修正されません。コードを見ないと、この状況で何をするのが最善かを提案するのは困難です。

スクレイプ機能を のようなよりネイティブなパーサーに置き換えることができますDOMDocument

于 2012-04-12T19:13:14.980 に答える
1

what you really need is:

$htm->__destruct();

to clear the simple_html_dom memory each time you don't need the $htm info anymore. e.g. use this where you have:

$htm->clear();

Note the double underscore!

于 2012-08-29T01:14:23.677 に答える