2

処理する必要のあるMySQLデータベーステーブルがあります。3行の処理には約1秒かかります(各行に対してCURL接続を作成する必要があるため)。したがって、妥当な時間を確保するためにPHPスクリプトをフォークする必要があります(1つのバッチで最大10,000行を処理するため)。

一度に10〜30のプロセスを実行しますが、明らかに、プロセスが重複していないことを確認するための何らかの方法が必要です(プロセスが取得および変更している行に関して)。

私が読んだことから、これを達成するための3つの方法があります。私はこの状況に最適な方法を決定しようとしています。

オプション1:トランザクションを開始しSELECT ... FOR UPDATE、各プロセスの行数を使用および制限します。データを配列に保存します。選択した行を「処理中」のステータスフラグで更新します。トランザクションをコミットしてから、選択した行を「終了」のステータスに更新します。

オプション2:「処理中」のステータスフラグとプロセスIDを使用して特定の行数を更新します。そのプロセスIDとフラグのすべての行を選択します。通常のようにデータを操作します。それらの行を更新し、フラグを「終了」に設定します。

オプション3:各プロセスのクエリにLIMIT ... OFFSET ...句を設定して、各プロセスが処理する一意の行を取得するようにします。SELECT次に、行IDを保存して実行しUPDATE、完了したら実行します。

どのオプションが最も安全かわかりません。オプション3は十分に単純に思えますが、これが失敗する可能性がある方法はあるのでしょうか。オプション2も非常に単純に見えますが、UPDATE原因によるロックによってすべてが遅くなるかどうかはわかりません。オプション1が最善の策のように思えますが、私はFOR UPDATEトランザクションにあまり詳しくないので、いくつかの助けを借りることができます。

更新:わかりやすくするために、現在、すべての行を選択し、Curlを介してデータを1つずつサードパーティに投稿するprocess.phpファイルが1つだけあります。このファイルにフォークを入れたいので、10,000行を10〜30の子プロセスに分割できます。

4

2 に答える 2

0

これを処理する別の方法は、処理する必要のあるIDをredisキュー(リスト)に入れることです。次に、リストからアイテムをポップ/プッシュできます。len(list)が空の場合、処理するものが残っていないことがわかります。

あなたがやりたいジョブキューイングのいくつかを実装するphpresqueプロジェクトもあります。

https://github.com/chrisboulton/php-resque

于 2013-02-13T05:38:36.227 に答える
0

このタスクを実行するために、(Bradによって提案された)mult_curl関数を使用することになりました。array_chunk()を使用して行の配列を100のグループに分割し、それらを処理するようにmulti_curlタスクを構成しました。ParallelCurlを使い始めましたが、正しく機能しなかったため、mult_curlを自分でコーディングしました。

10,000のカール接続を処理するのに約2時間かかっていたのが、ほんの数分でした。

于 2013-02-13T16:45:23.123 に答える