2011-09-29 13 views
8

私はphp/mysqlスクレーパーを作成しました。このスクレーパーはうまく動作しており、cronジョブとして最も効率的に実行する方法がわかりません。php cronジョブを実行するには、どれくらいの時間がかかるのですか?

サイトが300あり、それぞれ20〜200ページが削られています。すべてのサイトを削るには4〜7時間かかります(ネットワークの待ち時間やその他の要因によって異なります)。スクレーパーは毎日1回完全な作業を行う必要があります。

これを4〜7時間実行する1つのcronジョブとして実行するか、完了するまで毎時間7回実行するか、完了するまで10分ごとに実行しますか?

スクリプトは、このようにcronから実行するように設定されています

ている(この場合)600秒まで、一度に10件のURLを削るdo_scrape()関数を実行します
while($starttime+600 > time()){ 
    do_scrape(); 
} 

合格。 do_scrapeの実行には5〜60秒かかります。

これを実行する方法についてウェブ上の情報を見つけることができず、phpが実際に7時間の単一スクリプトとして実行されるように設計されているので、毎日実行することについては注意が必要です。

私はvanilla PHP/mysqlに書きましたが、lighttpd/mysql/php5だけをインストールしてdebian VPSを実行しています。私は問題なしで6000秒(100分)のタイムアウトでそれを動かしました(サーバは落ちませんでした)。

このタスクについてどのようにアドバイスしていただきますか。私は何を見なければならないのですか?私はこのすべてを間違って実行しようとしていますか?

ありがとうございます!

答えて

8

よく書かれたPHPスクリプトを長期間実行しても問題ありません。文字通り何ヶ月も連続して動いているスクリプトがあります。ちょうどあなたのメモリ使用量を見て、あなたは大丈夫です。

あなたのアーキテクチャーはかなり基本的なものであり、スケールがうまくいかない可能性があります。

大きなモノリシックスクリプトから分割征服戦略に移行することを検討することもできます。たとえば、あなたのスクリプトがすべてのURLに対して同期リクエストを作成しているように見えます。そうだとすれば、その7時間の実行時間の大半は、何人かのリモートサーバーからの応答を待っている間に費やされます。

理想的な世界では、この種のPHPは書かれません。スレッドを処理し、コールバックで非同期httpリクエストを簡単に実行できる言語は、はるかに適しています。

私はこれをPHPでやっていたのですが、URLからデータを取得して何らかの作業キューに応答データを貼り付けるN人の子供たちを蹴散らすスクリプトを目指していますほとんどすべてが実行され、キュー内で見つかった作業を処理します。

あなたのfetcher-script-managerを1時間に1回実行するだけで、データを取得する作業者プロセス(parellelで待ち時間があなたを殺すことはありません)を管理し、キューに作業を固定します。次に、キュー・クランチャはキュー上の作業を見て、それを刈り込みます。

キューを実装する方法によって、これはかなり拡張できます。リモートデータをフェッチし、いくつかのセントラルキューボックス(mysql、またはmemcacheなどに実装されたキューを持つ)に貼り付けることができます。キューから作業を取り、作業を行っている複数のボックスを持つことも考えられます。

もちろん、悪魔は詳細ですが、この設計は一般にシングルスレッドのfetch-process-repeatスクリプトよりも拡張性があり、通常はより堅牢です。

+0

返信をお待ちしています。 私たちは、後処理の量が最小であるため(2〜5秒間のページリクエストあたり〜150ms)、カーリングスクリプトと処理スクリプトではなく、モノリシック構造を採用することに決めました。 マルチカールを使用して10個のURLを一度に取得するので、理想的ではありませんが、セミマルチスレッドです。 Pythonは理想的かもしれませんが、私たちが知っているもの(php)を使って作業をすばやく完了させるケースがありました。 ありがとう! – Rob

2

完了まで1日に1回実行しても問題はありません。それが私のやり方です。 PHPがWebサーバー経由で提供されている場合、タイムアウトは大きな問題ですが、PHPの実行ファイルから直接解釈しているので、これは問題ありません。私はあなたが、よりタスクフレンドリーな、Pythonや何か他のものを使用するようにアドバイスします。

関連する問題