処理する必要のある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の子プロセスに分割できます。