サーバー送信イベントと PHP - サーバー上でイベントをトリガーするものは何ですか? 質問する

サーバー送信イベントと PHP - サーバー上でイベントをトリガーするものは何ですか? 質問する

全て、

HTML5 Rocks には、Server-sent Events (SSE) に関する初心者向けの優れたチュートリアルがあります。

http://www.html5rocks.com/en/tutorials/eventsource/basics/

しかし、重要な概念が理解できません。サーバー上でメッセージを送信するイベントをトリガーするものは何でしょうか?

言い換えれば、HTML5の例では、サーバーは単にタイムスタンプを送信するだけです一度:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
function sendMsg($id, $msg) {
  echo "id: $id" . PHP_EOL;
  echo "data: $msg" . PHP_EOL;
  echo PHP_EOL;
  ob_flush();
  flush();
}
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));

実際の例、たとえば Facebook スタイルの「ウォール」や株価表示システムなど、データが変更されるたびにサーバーが新しいメッセージをクライアントに「プッシュ」するようなものを構築する場合、どのように機能するのでしょうか。

言い換えると...PHP スクリプトには、継続的に実行され、データの変更をチェックし、変更が見つかるたびにメッセージを送信するループがありますか? もしそうなら、そのプロセスをいつ終了するかをどうやって知るのですか?

または、PHP スクリプトは単にメッセージを送信して終了しますか (HTML5Rocks の例の場合のように)? その場合、継続的な更新をどのように取得しますか? ブラウザーは単に PHP ページを一定の間隔でポーリングしているだけですか? その場合、それはどのように「サーバー送信イベント」ですか? これは、AJAX を使用して PHP ページを一定の間隔で呼び出す JavaScript で setInterval 関数を記述することとどう違うのですか?

申し訳ありませんが、これはおそらく非常に素朴な質問です。しかし、私が見つけることができた例はどれもこれを明確に示していません。

[アップデート]

私の質問の表現が悪かったと思いますので、ここで説明させていただきます。

Apple の株価の最新価格を表示する Web ページがあるとします。

ユーザーが初めてページを開くと、ページは「ストリーム」の URL を含む EventSource を作成します。

var source = new EventSource('stream.php');

私の質問はこれです - 「stream.php」はどのように動作するのでしょうか?

こんな感じですか?(疑似コード):

<?php
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
    function sendMsg($msg) {
        echo "data: $msg" . PHP_EOL;
        echo PHP_EOL;
        flush();
    }

    while (some condition) {
        // check whether Apple's stock price has changed
        // e.g., by querying a database, or calling a web service
        // if it HAS changed, sendMsg with new price to client
        // otherwise, do nothing (until next loop)
        sleep (n) // wait n seconds until checking again
    }
?>

言い換えれば、「stream.php」はクライアントが「接続」されている限り開いたままになるのでしょうか?

もしそうなら、それは同時ユーザーと同じ数のスレッドが動いていることを意味しますかstream.php?もしそうなら、それは実現可能でしょうか、またはアプリケーションを構築する適切な方法でしょうか?そして、いつそれが可能かを知るにはどうすればよいでしょうか?終わりstream.php?のインスタンス

私の素朴な印象では、これが事実であれば、PHPないこの種のサーバーに適したテクノロジーです。しかし、これまで私が見たデモはすべて、PHP がこれに適していることを示唆しており、それが私が混乱している理由です...

ベストアンサー1

「...「stream.php」は、クライアントが「接続」されている限り開いたままになりますか?」

はい、あなたの疑似コードは合理的なアプローチです。

「では、stream.php のインスタンスをいつ終了できるかをどうやって知るのですか?」

最も一般的なケースでは、ユーザーがサイトを離れたときにこれが発生します。(Apache は閉じられたソケットを認識し、PHP インスタンスを強制終了します。) サーバー側からソケットを閉じる主なタイミングは、しばらくデータがないことがわかっている場合です。クライアントに送信する最後のメッセージは、特定の時間に戻ってくるように伝えることです。たとえば、株式ストリーミングの場合、午後 8 時に接続を閉じ、クライアントに 8 時間後に戻ってくるように伝えることができます (NASDAQ が午前 4 時から午後 8 時まで取引可能であると仮定)。金曜日の夕方には、月曜日の朝に戻ってくるように伝えます。(私は SSE に関する本を近々出版する予定で、このテーマにいくつかのセクションを割く予定です。)

「...そうだとすると、PHP はこの種のサーバーに適したテクノロジーではありません。しかし、これまで私が見たデモはすべて、PHP がこの用途に適していることを示唆しているので、私はとても混乱しています...」

まあ、PHP は通常の Web サイトには適した技術ではないと主張する人もいますが、それは正しいです。LAMP スタック全体を C++ に置き換えれば、はるかに少ないメモリと CPU サイクルで実現できます。しかし、それにもかかわらず、PHP はほとんどのサイトで問題なく機能しています。使い慣れた C のような構文と多数のライブラリの組み合わせにより、PHP は Web 作業に非常に生産性の高い言語であり、多くの PHP プログラマーを雇用でき、書籍やその他のリソースが豊富で、大規模なユースケース (Facebook や Wikipedia など) があるため、管理者にとって安心できる言語です。これらは基本的に、ストリーミング技術として PHP を選択する理由と同じです。

一般的な設定では、PHP インスタンスごとに NASDAQ への接続は 1 つではありません。代わりに、NASDAQ への単一の接続を持つ別のプロセス、またはクラスター内の各マシンから NASDAQ への単一の接続を持つプロセスを用意します。これにより、価格が SQL/NoSQL サーバーまたは共有メモリにプッシュされます。次に、PHP はその共有メモリ (またはデータベース) をポーリングし、データをプッシュします。または、データ収集サーバーを用意し、各 PHP インスタンスがそのサーバーへのソケット接続を開きます。データ収集サーバーは、更新を受信すると、各 PHP クライアントにプッシュし、次にそのデータをクライアントにプッシュします。

ストリーミングに Apache+PHP を使用する場合の主なスケーラビリティの問題は、各 Apache プロセスのメモリです。ハードウェアのメモリ制限に達したら、クラスタに別のマシンを追加するか、Apache をループから切り離して専用の HTTP サーバーを作成するかというビジネス上の決定を下します。後者は PHP で実行できるため、既存の知識とコードをすべて再利用できます。または、アプリケーション全体を別の言語で書き直すこともできます。純粋な開発者である私なら、専用の合理化された HTTP サーバーを C++ で作成します。マネージャーである私なら、別のボックスを追加します。

おすすめ記事