1

phpライブラリsimple_html_domを使用して、URLのリストをdomとしてループしています。これらのそれぞれについて、文字列を見つけようとします。見つかった場合は、URLを配列に保存します。それ以外の場合は、次のサイクルに進み、urls配列を返します。最後に。スクリプトは、URLごとに数秒程度かかります。いくつかのループの後、スクリプトがファイル内の$ dom-> load($ url)行でスタックし、htmlがセグメンテーション違反をスローします。ループの数はURLリストによって異なります。ループスクリプトがスタックしているURLでのみ動作するテストスクリプトでload($ url)の呼び出しを分離しようとしましたが、テストスクリプトはエラーなしで終了します(ただし、domのprint_rを確認できません。ページソースを表示しようとすると、Firefoxがクラッシュします)。私はLAMPサーバーに取り組んでいます。コードは次のとおりです。

error_reporting(E_ALL);
ini_set("max_execution_time", "300");
ini_set("memory_limit", "512M");
ini_set('output_buffering', 0);
ini_set('implicit_flush', 1);
ob_end_flush();
ob_start();
set_time_limit(100);

$urlArray = array();

foreach($urlArray as $url){
    $found = false;
    $dom = file_get_html($url);
    foreach(( $dom->find('target')) as $caught){
        array_push($link, $caught);
        $found = true
    }
    if($trovato){
        return $link;
    }else{
        echo "not found";
    }
}

助けのためのthx

4

1 に答える 1

6

よくある問題ですが、ここにバグhttp://sourceforge.net/p/simplehtmldom/bugs/103/があります。ifステートメントの前に次の行を追加します。

$dom->clear();
unset($dom);

ほとんどの場合、その後はsegfaultは表示されません。しかし、数千のURL(私のように:))を解析すると、再び会う可能性があります。したがって、私の解決策は、simple_html_dom.phpファイルを開き、146から149までのすべての行にコメントを付けることです。

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

更新:この行にコメントすると、メモリ消費量が各解析の反復で増加します

于 2013-02-19T20:27:48.247 に答える