1

クローラーに実行させる可能性のある、約5分以上の深い再帰の実行について話しています。ページのURLリンクとサブURLリンクを抽出するため

PHPでの深い再帰は現実的ではないようです

例えば

getInfo("www.example.com");

function getInfo($link){
   $content = file_get_content($link)

   if($con = $content->find('.subCategories',0)){
      echo "go deeper<br>";
      getInfo($con->find('a',0)->href);
   }

   else{
      echo "reached deepest<br>";
   }
}
4

1 に答える 1

8

再帰を使用してこのようなことを行うことは、実際にはどの言語でも悪い考えです。そのクローラーがどれだけ深くなるかわからないため、スタックオーバーフローが発生する可能性があります。そうでない場合でも、PHPには末尾呼び出しがないため(必要な場合を除いてスタック情報を保持しないため)、巨大なスタックのために大量のメモリを浪費します。

見つかったURLを「クロールする」キューにプッシュします。このキューは繰り返しチェックされます。

$queue = array('www.example.com');
$done = array();
while($queue) {
    $link = array_shift($queue);
    $done[] = $link;
    $content = file_get_contents($link);
    if($con = $content->find('.subCategories', 0)) {
        $sublink = $con->find('a', 0)->href;
        if(!in_array($sublink, $done) && !in_array($sublink, $queue)) {
            $queue[] = $sublink;
        }
    }
}
于 2012-06-30T22:02:58.550 に答える