6

私は、バックグラウンド ジョブを処理するための php-resque やその他のジョブ処理システムに精通していますが、必要なことを実行するとは思いません。

この場合、外部システムに対して複数 (2 ~ 4) の独立したコールアウトを実行し、統合された応答をクライアントに返す必要がある着信 Web サービス要求があります。各コールアウトには 300 ~ 500 ミリ秒かかる場合があるため、各コールアウトを並行して実行して、プロセス全体で合計 500 ミリ秒 +/- を超えないようにしたいと考えています。

php-resque やその他のシステムに関する私の問題は、それらのコールアウトの発行を開始するのに 1 秒でも待つのは長すぎて待つことができないということであり、別のアプローチを検討しています。

私が考えていること:

  1. 個々のコールアウトが記述され、指定された一意のリクエスト ID とともにデータベースに保存されます
  2. 非同期phpプロセス(別名「ワーカープロセス」)としてジョブをすぐに開始します
  3. 各ワーカーはその結果をジョブ レコードに書き戻し、完了したことを示します。
  4. その間、50 ~ 100 ミリ秒ごとにジョブ テーブルをポーリングして、各ジョブのステータスを確認します。
  5. それぞれが完了すると、必要に応じて結果を解析し、応答を返します。

もちろん、各リクエストと全体的なプロセスにタイムアウトを実装します...

考え?私が間違っている?php-resque は複数のジョブを並行して事実上瞬時に開始できますか?

4

2 に答える 2

2

計画は機能するはずですが、 PHPプロセス制御関数を使用することで、すべてのデータベース通信やポーリングさえも回避できると思います。

  1. メインプロセスを、並行して実行するために必要なタスクの回数だけフォークします。参照:pcntl_fork
  2. それらのフォークされたプロセスでタスクを実行し、それらを正常に終了させます。
  3. タスクを開始するプロセスは、タスクが終了するときにSIGCHLDシグナルをリッスンして、タスクがすべて完了するのを待つ必要があります。または、選択したタイムアウトの前にそれらがない場合は、SIGTERMシグナルをそれらに送信してクリーンアップします。pcntl_sigtimedwaitおよびposix_killを参照してください。

ただし、PHPCLIスクリプトでこれらの関数を使用する必要があります。理由は...

http://www.php.net/manual/en/intro.pcntl.php

Webサーバー環境内でプロセス制御を有効にしないでください。Webサーバー環境内でプロセス制御機能を使用すると、予期しない結果が生じる可能性があります。

ただし、Webサーバーはexec()CLIスクリプトを簡単に作成できます。これにより、すべてのハードワークが実行され、それらのタスクのステータスが返されます。

于 2012-10-08T05:32:39.980 に答える
1

外部呼び出しが単にHTTPリクエストである場合は、curlを使用して複数のリクエストを実行できます。彼らはあなたが必要としていることを正確に行っているようです。

何か違う場合は、Gearmanを強くお勧めします。

手を汚して独自のデーモンを作成したい場合は、IPC関数をスキップして、ZeroMQなどのもう少し高レベルのものを選択し、 Supervisoredを使用してPHPプロセスが停止した場合に再起動することをお勧めします。長時間実行されるPHPプロセスを作成するのは比較的難しいため、外部スクリプトランダムに停止し、それを適切に処理する準備をするという概念を使用してこれを構築する必要があります。

于 2012-10-08T09:30:21.337 に答える