2011-01-11 10 views
0

simplehtmldomを使用して自分自身でWebクローラーを作成しており、クロールプロセスがきちんと機能しています。開始ページをクロールし、すべてのリンクをデータベーステーブルに追加し、セッションポインタを設定し、metaがページを更新して次のページに移動します。それはリンクが足りなくなるまで続ける。cronを使用してPHP Webクローラーを作成する

それはうまくいくが、明らかに大規模なウェブサイトのクロール時間は面倒だ。私は物事を少しスピードアップしたいと思っていましたし、おそらくそれをcronの仕事にしたいと思っていました。

メモリ制限/実行時間をより高く設定する以外に、できるだけ早く効率的にするためのアイデアはありますか?

+1

PHPプロファイラ用のSOまたはGoogleを検索してください。何が減速しているのかを正確に判断することができます。そこから、 'file_get_contents() 'を高速化する方法のようなより具体的な質問をすることができます。 –

+1

私はこのサイトをデッドリンクをチェックするためだけにビルドし、すべてのリンクが適切なアンカー+タイトルを持っていることを確認し、すべてのページにtitle/h1タグがあることを確認します。 – Horse

答えて

1

メモリはクローラにとって問題ではありません。

1ページが終了し、関連するすべてのデータをデータベースに書き込んだら、このジョブ用に作成したすべての変数を取り除く必要があります。

100ページ後のメモリ使用量は、1ページ後と同じでなければなりません。これが事実でない場合は、理由を調べてください。

異なるプロセス間で作業を分割することができます。通常、ページの解析には読み込み時間がかかりませんので、見つかったすべてのリンクをデータベースに書き込んで、ドキュメントをダウンロードするだけの他の複数のプロセスを一時ディレクトリ。

  1. 労働者にはリンクがダウンロードされていないことを確認する必要があります。
  2. プロセスがない場合は、プロセスは新しいリンクを待機します。
  3. 各スキャン後に一時ファイルが削除されます。
  4. リンクがなくなるとダウンロードプロセスが停止します。これをアーカイブするには、 "kill flag"を設定します。これは特別な名前のファイルでも、データベースのエントリでもかまいません。
+0

私はかなり緊密なプロセスを書いたと思いますが、データベースのやりとりでいくらかの改善ができます。私が確信しているのは、クーロンを重複させないでクルマにする方法だけです。明らかにページが大きくなればなるほど処理が必要になるので、処理時間が無駄になることなく、または指数関数的に重複することなく、ジョブの一定量のインスタンスにどのように適合できるかはわかりません – Horse

2

ウェブブラウザでスクリプトを実行しているようです。コマンドラインから実行することを検討することもできます。同時に複数のスクリプトを実行して、異なるページでクロールすることができます。それは物事を速めるはずです。

+0

彼は、私は彼がすでにコマンドラインスクリプトとしてそれを書いていたと思うので、クローンです。 –

関連する問題