2011-06-27 4 views
-2

サイトマップを作成するためのリンクと画像を取得するサイトクローラを作成しましたが、実行中に殺されました!この方法(例えばhttp://www.mysite.com
getUrl()に設定始まるメインアドレスで :それは私のクラス全体私のサイトのクローラが実行中に死んだ

class pageCrawler { 

    ....... 

    private $links = array(); 

    public function __construct ($url) { 

    ignore_user_abort (true); 
    set_time_limit (0); 
    register_shutdown_function (array ($this, 'callRegisteredShutdown')); 
    $this->host = $urlParts [ 'host' ]; 
    $this->crawlingUrl ($url); 
    $this->doCrawlLinks(); 

} 

$this->crawlingUrl ($url)ないのURLの内容
findLinks()を取得し、その後すぐにわかることでURLに接続:a hrefを返しますimg srcを入力し、返信リンクを$this->links[]に保存すると、出力がフラッシュされ、その後に次のコードが挿入されます。

​​

$this->doCrawlLinks(): それは、その後、その後の最初の要素をシフト再びdoCrawlLinks()実行を最初の要素 をシフトし、最初の要素のURLコンテンツを取得$this->linksをチェックして、私は$this->links
の最初の要素のためのトップに記述し、同じプロセスを行います$this->linksまで$this->linksは、それが仕事だ私のクラスの一般的な傾向だが、突然、それはCRだ空


を取得します突然灰になる。私はset_time_limit(0)を永遠に行うように設定しましたが、私のshoutdoown関数dosentが実行されるため、私のプロセスは終了しませんでした!私は自分の問題がどこにあるのか混乱した

+0

エラー報告を有効にしていますか? error_reporting(E_ALL);スクリプトの残りの部分でエラーが発生したためにタイムアウトした場合はどうしますか? – Duniyadnd

+0

エラー表示なし –

+0

"connect to url by fsockopen" - OMG!なぜ????? – symcbean

答えて

1

野生の推測 - doCrawlLinks()で再帰がありますか?深い再帰は単にプロセスをクラッシュさせる可能性があります。または、プロセスごとのメモリ制限によってクラッシュする可能性があります。

私の経験から、データベース内のリンクのリストを保留中/処理済みのフラグで保持すると非常に便利です。いつでもクローラをシャットダウンして再開することができます(またはクラッシュ後に再開します)。

+0

メモリ制限は私の問題だと思っていましたが、時には3回または4回の再帰でクラッシュしました!:( –

関連する問題