0

各プロジェクトを購読している特定の数の人々がいる「プロジェクト」を含むWebサイトがあります。

プロジェクトの「最後」に、すべてのサブスクライバーが収集され、処理されます。この場合、約 1,000 人のサブスクライバーがあり、そのデータを取得して処理する必要があります。また、配列内の各データ セットと共に格納される関連データもいくつかあります。

前回、最大 300 個のアイテムを処理したときに、PHP がメモリ不足になりました。メモリをブーストし、処理できるようにしました。今回はそんなことはないと思います。

現在、プロジェクトをプルしてサブスクライバーを処理するジョブを使用しています。このジョブでは、SQL クエリを実行してすべての「サブスクライバー」を取得し、それらとその関連データを配列に格納します。次に、配列が繰り返されて、個々のサブスクライバを処理する個々のジョブが作成されます。

私の質問は:

「ブロック」などでこれを行う方法はありますか? または、メモリへの影響を軽減するより良い方法はありますか? 何千人もの加入者がいる場合に備えて、これを拡張できるようにしたいと考えています。

今はこんな流れです。

  • プロジェクト「終了」
  • ジョブが開始され、いくつかのフラグが設定され、すべてのサブスクライバーがプルされます
  • MySQL (サブスクライバー) からのデータの配列がループされ、サブスクライバーごとに個別のジョブが作成されます。
  • 各サブスクライバ ジョブは、エンジンによって処理されます。

これを行うための最良のプロセスを特定するのに苦労しています。

4

1 に答える 1

0

できれば int-key でソートされたメインの RS を使用し、1 つのサブスクライバーのみを処理します。

部分的なジョブの終了時に、完了したジョブの ID を保存します。最後に、完了したかどうかを確認し、親スクリプトにそれを呼び出してもらいます。

processscript の最後に usleep を追加して、他のプレイヤーが参加できるようにします。

 while(file_get_contents('http://yourscript.php') != false);

(include を使用しないとオーバーヘッドが追加されますが、メモリ リークを防ぐことができます)

于 2013-03-20T23:05:19.493 に答える