4

サーバー送信イベントの実装は、一見すると非常に単純な作業です。Mozilla ドキュメントの例を借りると、クライアント側のコードは次のようになります。

var evtSource = new EventSource("ssedemo.php");
evtSource.onmessage = function(e){//do stuff with e.data here}

私が理解するのが難しいのは、サーバー側で何が起こるかです。私を困惑させるもの

  • したがって、ssdemo.php からイベントを送信し続けたいということは、ループで実行し、送信していないときにスリープ状態にする必要があることを意味します。
  • ただし、デフォルトでは、Apache は実行に「時間がかかりすぎる」スクリプトを強制終了するように設定されているため、そのようにスクリプトを実行するように設定しない限り、無限ループになることはありません。
  • 同じ SSE サービス (ssdemo.php) を要求する 10 人のユーザーがいる場合、そのループ スクリプトのインスタンスが 10 あることになりますか?

サーバー側のコードがどのように機能するか、コーディングする必要があるかについての私の理解には、欠陥があるか、素朴であるか、またはその両方であると思われます。これを行う正しい方法へのポインタをいただければ幸いです。

4

2 に答える 2

2

あなたの理解は正しいです。PHP は実行し続ける必要があり、PHP ではループが必要になり、無料の Apache スレッドがすぐに不足してしまいます。

多数の接続を処理する必要がある場合は、多数の開いている接続を処理できる Node.js や Tornado などのイベントベースのサーバーを使用する必要があります。

PHP を使用したい場合、部分的な解決策は、数秒後に接続を閉じることです。ブラウザが再接続されるので、ポーリングと SSE のハイブリッドが得られます。

PHP ではsys_getloadavg()、接続を開いたままにできるかどうか、または空きプロセスが不足しているかどうかを確認できます。

于 2013-09-01T18:39:02.747 に答える