0

私が持っているもの:

(必要に応じて、localhost を確認するか起動してください: http://pastebin.com/virLR7dF )

(私のケースを示す画像を見てください: http://iv.pl/images/47143498348127804676.png )

特定の Web サイトをクロールし、データを変数として抽出する PHP スクリプトがあります。

$ID = "data"; //this is just an example
$name = "data";
$price = "data";
$image = "data";

スクリプトは、このデータを MySQL DB に配置します。

なにが問題ですか?

for ループで自動化できるので、一度により多くのデータを取得できます。しかし、1,000,000 回ループすると、ある時点でスクリプトがフリーズし、最初からやり直す(壊れた場所を見つけてその時点から開始する) ことが問題になります。

PHP/JS を使用して次のようにする方法:

1.データを 10 個集める

2.収集されたデータに関する情報の停止と表示

3.データの次の 10 部分を収集する

4.以前に表示された情報を停止して新しい情報を追加する

*次の部分が収集された後に停止する一時停止機能があります

*最後の部分が収集された後に開始する RESUME 機能があります

4

2 に答える 2

1

出力バッファリングが PHP で役立つかもしれません

ob_startob_flush を試す

ob_startこの関数は、出力バッファリングをオンにします。出力バッファリングがアクティブになっている間は、スクリプトから (ヘッダー以外の) 出力は送信されず、出力は内部バッファーに格納されます。

ob_flushこの関数は、出力バッファの内容を送信します (存在する場合)

于 2012-05-04T08:01:04.460 に答える
0

これを行うと問題が発生する可能性があることがいくつかあります。

1) ループ内でエラーが発生し、スクリプトの実行が停止します。

解決策: エラーをキャッチ可能な例外に変える

2) 制限時間を超えた。

解決策: 制限時間をゼロに設定する

例:

set_error_handler(function($errno, $errstr, $errfile, $errline) {
    if($errno != E_STRICT && $errno != E_DEPRECATED && $errno != E_NOTICE) {
      throw new Exception($errstr.' in '.$errfile.' on line '.$errline);
    }
    return false;
});

set_time_limit(0);

function my_loop_func() {
 // do what ever...
}

while(true) {
  try {
     my_loop_func();
  }
  catch(Exception $e) {
    // write some log message here might be good
  }
  sleep(10);
}
于 2012-05-04T08:16:51.900 に答える