PHP では、複数の独立したタスクを並行して実行したいと考えています。各タスクは、結果の準備が整ったときに訪問者のブラウザーに送り返したい結果を生成します。通常どおりページをロードしてから、HTML5 SSE (サーバー送信イベント) を使用して、HTTP 接続を開いたまま、データが使用可能になったときにブラウザーに送信するという考え方ですkeep-alive
。出力をフラッシュしたいだけではありません。私はかなりの数の異なるタスクを実行しますが、それらはすべて並列実行に最適な候補であるため、それらを同期的に実行したくありません。
私が最初に考えたのは、 pthreads 拡張機能を使用してマルチスレッド化を行うことでした。スレッドが PHP でどのように機能するかは正確にはわかりません。スレッドを実行している間、ブラウザへの接続は開いたままになっていますか?つまり、スレッドからブラウザにデータを安全に送り返すことができますか? pthreads はかなり安定していると思いますが、実験的であるため、使用する必要があるとは確信していません。
pthreads は、かなり良い結果をもたらす実験でした。その制限または機能はいつでも変更される可能性があります。それが実験の性質です。
次に、自分のタスクにワーカーを使用できるようにする Gearman のことを思い出しました。複数のジョブを並行して実行したいので、ジョブが終了するのを待っている間にスクリプトの実行がブロックされたくないので、バックグラウンド ワーカーが必要です。これは Gearman では問題ありませんが、バックグラウンド ワーカーを使用した場合に結果を Gearman クライアントに送り返すことができるかどうかはまったくわかりません。私が理解したように、バックグラウンド ワーカーは独自のプロセスまたはコンテキストで実行されるので、これはバックグラウンド ワーカーからブラウザにデータを送り返すことができないことを意味すると思いますか? GearmanClientクラスがコールバックを設定するためのいくつかのメソッドを提供していますが、私の調査から読み取ることができる限り、これらのコールバックは同期呼び出しでのみ呼び出されるようです。理想的には、バックグラウンド ワーカーから結果を直接送り返すか (それが可能かどうかは疑問です)、ジョブ ステータスについて Gearman を調査することなく、バックグラウンド ワーカーが終了時にクライアントに通知するようにします。そこからデータを送り返すことができるので、コールバック ハンドラが最適です。
ZendQueueと一緒に ActiveMQ などのメッセージング システム (または memcached) を使用することも検討しました。アイデアは、チャネルでワーカー要求を送信し、別のチャネルで結果をリッスンすることです。結果チャネルからメッセージが読み取られると、メッセージはブラウザに直接送信されます。欠点は、結果メッセージをリクエストにマッピングするなど、追加の作業が必要になることです。
最終的に、私は Gearman のアプローチに非常に傾いていますが、私が望むことを達成できるかどうかはわかりません。要約すると、それぞれ最大数秒かかる並列タスクを実行し、結果の準備ができたら (HTML5 SSE を使用して) 個別にブラウザーに送り返したいと考えています。
私のアプローチは可能ですか?他にアイデアはありますか?よろしくお願いします!