-2

私は Web ボットを持っていますが、メモリを大量に消費します。しばらくすると、メモリ使用量が 50% に達し、プロセスが強制終了されます。なぜそんなにメモリ使用量が増えているのかわからないので、並列curlリクエスト用のライブラリである「para.php」を入れていませんでした。Web クローラーについてもっと知りたいと思い、いろいろ検索しましたが、役立つドキュメントや使用できる方法が見つかりませんでした。

これは、私が para.php を取得したライブラリです。

私のコード:

require_once "para.php";

class crawling{

public $montent;


public function crawl_page($url){

    $m = new Mongo();

    $muun = $m->howto->en->findOne(array("_id" => $url));

    if (isset($muun)) {
        return;
    }

    $m->howto->en->save(array("_id" => $url));

    echo $url;

    echo "\n";

    $para = new ParallelCurl(10);

    $para->startRequest($url, array($this,'on_request_done'));

    $para->finishAllRequests();

    preg_match_all("(<a href=\"(.*)\")siU", $this->montent, $matk);

    foreach($matk[1] as $longu){
        $href = $longu;
        if (0 !== strpos($href, 'http')) {
            $path = '/' . ltrim($href, '/');
            if (extension_loaded('http')) {
                $href = http_build_url($url, array('path' => $path));
            } else {
                $parts = parse_url($url);
                $href = $parts['scheme'] . '://';
                if (isset($parts['user']) && isset($parts['pass'])) {
                    $href .= $parts['user'] . ':' . $parts['pass'] . '@';
                }


                $href .= $parts['host'];
                if (isset($parts['port'])) {
                    $href .= ':' . $parts['port'];
                }
                $href .= $path;
            }
        }
        $this->crawl_page($longu);
    }
}

public function on_request_done($content) {
    $this->montent = $content;
}


$moj = new crawling;
$moj->crawl_page("http://www.example.com/");
4

1 に答える 1

0

このcrawl_page関数を1つのURLで呼び出します. コンテンツが取得され ($this->montent)、リンクがチェックされます ($matk)。

これらはまだ破棄されていませんが、再帰的に行って、crawl_page への新しい呼び出しを開始します。$this->moment は新しいコンテンツで上書きされます (問題ありません)。少し下にある $matk (新しい変数) には、新しい $this->montent へのリンクが設定されています。この時点で、メモリには 2 つの $matk があります。最初に処理を開始したドキュメントのすべてのリンクを含むものと、元のドキュメントで最初にリンクされたドキュメントのすべてのリンクを含むものです。

すべてのリンクを見つけてデータベースに保存することをお勧めします(すぐに再帰的になるのではなく)。次に、データベース内のリンクのキューを 1 つずつクリアします (新しいドキュメントごとに新しいエントリがデータベースに追加されます)。

于 2013-05-15T12:51:14.313 に答える