2

データベース内のテーブルの 1 つで各行 (またはユーザー) を処理し、cURL を使用して行で見つかったユーザー名に基づいて URL を取得し、追加情報を同じ行。これはほとんどの場合問題なく動作しますが、データベース全体を処理するには約 20 分以上かかるようで、while ループに入るほど遅くなるようです。現在、約 4000 行ありますが、今後さらに増える予定です。

現在、私のコードの簡略版は次のようになっています。

$i=0;
while ($i < $rows) {
    $username = mysql_result($query,$i,"username");
    curl_setopt($ch, CURLOPT_URL, 'http://www.test.com/'.$username.'.php');
    $page = curl_exec($ch);
    preg_match_all('htmlcode',$page,$test)
    foreach ($test as $test3) {
         $test2 = $test[$test3][0];
    }
mysql_query("UPDATE user SET info = '$test2' WHERE username = '$username');
    ++$i;
}

MySQL クエリを while ループに入れてはならないことはわかっています。それは私が削除する最後のクエリですが、非常に長い間何度も実行する必要がある while ループを処理する最良の方法は何ですか?

最善の選択肢は、スクリプトを一度に 10 行ずつ実行してから停止することだと考えていました。たとえば、CRON にスクリプトがあるので、5 分ごとにスクリプトを実行し、10 行を実行して停止し、CRON ジョブが再開されたときに次の 10 行を取得することを何らかの方法で認識したいと考えています。ただし、これを達成する方法がわかりません。

どんな助けでも大歓迎です!

4

3 に答える 3

1

データの段階的な読み込みについて:
テーブルに「last_updated」列を追加して、ページを読み込むたびに更新することができます。次に、Web サイトを再度読み込む前に、列を現在のタイムスタンプと比較します。

例:

mysql_query("UPDATE user SET info = '$test2', last_updated = ".time()." WHERE username = '$username');

データをロードするときは、「WHERE last_updated > (time()-$time_since_last_update)」にします。

于 2013-10-24T14:31:25.347 に答える
0

ここでは LIMIT と OFFSET が友達です。バスティアンが提案したようにDBフィールドを介して現在の場所を追跡するか、最後に使用したオフセットをどこかに保存し(フラットファイルである可能性があります)、スクリプトを実行するたびにそれを増やすこともできます. これ以上データを取得できなくなったら、0 にリセットします。

于 2013-10-24T14:48:13.280 に答える