9

一般的な非同期ジョブを開始するユーザー要求を受け入れ、ジョブを実行するためのワーカープロセス/スレッドを作成することを目的としたPHPWebアプリケーションについて考えてみます。ジョブは特にCPUやメモリを集中的に使用しませんが、I/O呼び出しをかなり頻繁にブロックすることが予想されます。1秒間に開始するジョブは1つか2つまでですが、実行時間が長いため、一度に多くのジョブが実行される場合があります。

したがって、ジョブを並行して実行することが最も重要です。また、各ジョブは、ハングしたワーカーの強制終了、ユーザーの要求に応じたワーカーの中止などを担当するマネージャーデーモンによって監視される必要があります。

このようなシステムを実装するための最良の方法は何ですか?私は見えます:

  1. マネージャーからワーカーをフォークする-これは最低レベルのオプションのようであり、私は自分で監視システムを実装する必要があります。ApacheはWebサーバーであるため、このオプションでは、PHPワーカーをFastCGI経由で起動する必要があるようです。
  2. ある種のジョブ/メッセージキューを使用します。(gearman、beanstalkd、RabbitMQなど)-当初、これは当然の選択のように思われました。いくつかの調査の後、私はすべてのオプションと多少混乱しています。たとえば、Gearmanは、ワーカーの固定プールがある巨大な分散システム用に設計されているように見えます...したがって、必要なもの(ジョブごとに1人のワーカー)に適しているかどうかはわかりません。
4

3 に答える 3

8

Linuxを使用している場合は、pcntl_fork子供をフォークするために使用できます。次に、「マスター」は子供たちを監視します。各子はそのタスクを完了し、通常どおりに存在します。

個人的には、私の実装ではメッセージキューは必要ありませんでした。「マスター」でロック付きの配列を使用しただけです。子供が仕事を得るとき、それは仕事ID番号でロックファイルを書きます。その後、マスターはその子が終了するまで待機します。子が終了した後もロックファイルがまだ存在する場合は、タスクが完了していないことがわかり、同じジョブで子を再起動します(ロックファイルを削除した後)。状況に応じて、単純なデータベーステーブルにキューを実装できます。テーブルにジョブを挿入し、30秒または60秒ごとにマスターのテーブルで新しいジョブを確認します。次に、子が終了したら(そして子がロックファイルを削除した後)、テーブルからそれらを削除するだけです。一度に複数の「マスター」を実行している場合、これには問題がありますが、グローバルな「

また、FastCGIでフォークすることはお勧めしません。環境は持続することを意図しているため、非常にあいまいな問題が発生する可能性があります。代わりに、Webインターフェイスが必要な場合はCGIを使用しますが、理想的にはCLIアプリ(デーモン)を使用します。他のプロセスのマスターとインターフェイスするには、TCP通信用のソケットを使用するか、通信用のFIFOファイルを作成します。

ハングしたワーカーの検出に関しては、「ハートビート」システムを実装できます。このシステムでは、子がSIG_USR1数秒ごとにマスタープロセスにを発行します。その後、2、3回も子供から連絡がない場合は、ハングアップしている可能性があります。しかし、PHPはマルチスレッドではないため、子がハングしているのか、それともブロッキングリソース(データベース呼び出しなど)を待っているだけなのかがわかりません...「ハートビート」の実装については、ティック機能を使用してハートビートを自動化できます(ただし、呼び出しのブロックはまだ実行されないことに注意してください)...

于 2010-08-18T14:36:04.310 に答える
1

ワーカープールは興味深いかもしれません:

https://github.com/qxsch/WorkerPool

https://github.com/qxsch/WorkerPool/blob/master/examples/asyncExample.php

于 2014-05-06T16:18:06.643 に答える
1

pcntl_forkを使用して多くのジョブで非同期の1つのタスクを実行するか、永続性クエリを(s)秒ごとに作成しますが、CPUの消費量が多い場合は注意が必要ですが、メモリを再度割り当てることができないため、処理メモリがハングする可能性があります。 Gearmanを使用して完全にビルドすることも、IronWorkerなどのクラウドワーカーを使用して試すこともできます。

于 2016-03-31T04:59:28.903 に答える