-1

getdata.phpいくつかの有用な情報をtxtファイルまたはデータベースに保存するよりも、cUrlによって特定のWebサイトページのコンテンツを取得するWebスクレイピングPHPページ()を作成したとしましょう。

の擬似コードgetdata.php

min = get latest search id from database
max = 1.000.000 (yes one million different pages)

while (min < max) {

  url = "http://www.website.com/page.php?id=".$min
  content = getContentFromURL(url)
  saveUsefulInfoToDb(content)
  min++
  set latest search id as min in database
}

それは大丈夫です、プロセスは、

  1. getdata.phpブラウザで開く
  2. 待って
  3. 約100万ページが削られるので、まだ待ってください。
  4. 待って
  5. そして最後にタイムアウトを要求します。
  6. 失敗

したがって、問題は、このプロセスを合理的にする方法がわからないことです。ブラウザでページを開き、URLのスクレイピングが完了するのを待つのは、本当に悪い習慣だと思います。

getdata.phpをcronのようにバックグラウンドで実行可能にするにはどうすればよいですか?

それを行うための最良の方法は何ですか?

ありがとう。

4

2 に答える 2

3

@hackartistsの回答に加えて、ブラウザからこのPHPページをまったく呼び出さないように追加します。代わりに、コマンドラインから呼び出します

http://www.php.net/manual/en/features.commandline.introduction.php

ブラウザで getdata.php を開く

する必要があります

cron を使用してコマンドラインから getdata.php を実行するようにスケジュールします。

さらに、成功または失敗をログに記録して、Web スクレイピング ジョブがいつ失敗したかを知るために、ログ ファイルの監視を設定できるようにします (結局のところ、毎日ブラウザーの前に座って自分で監視したくはありません)。

于 2012-06-08T19:02:21.320 に答える
2

コードの先頭で使用

set_time_limit(0);
ignore_user_abort(true);

次に、cronを使用して、毎日または必要なときにいつでも起動します。これをWebページではなく、バックグラウンドプロセスにする必要があります。これらの2行により、Webページまたはcmd行スクリプトとして無期限に実行できます。Webページとして作成したい場合でも、cronを使用して次のような行で「起動」することができます。

0 0 * * * /usr/bin/curl "http://yoursite.com/getdata.php" >> "/var/www/errors.log"

私はこれを何度も行ってきたので、少しアドバイスがあります。ログ関数を作成してファイルに出力し、実行中にファイルが何をしているかを確認できるようにします。そうしないと、可視性がなくなり、phpファイルにキルスイッチをプログラムできなくなります。 unix topを使用したり、apacheを再起動したりせずに、実行を停止するように指示できます。キルタイムにハードコーディングして、特定の時間後に1日より長く実行され、2番目のインスタンスが起動し、一度に複数のインスタンスが実行されないようにすると停止することをお勧めします。

于 2012-06-08T19:01:10.353 に答える