すべて、
HTML5 Rocksには、サーバー送信イベント(SSE)に関する優れた初心者向けチュートリアルがあります。
http://www.html5rocks.com/en/tutorials/eventsource/basics/
しかし、私は重要な概念を理解していません-メッセージを送信させるサーバー上のイベントをトリガーするものは何ですか?
つまり、HTML5の例では、サーバーはタイムスタンプを1回送信するだけです。
<?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
あなたが同時に実行しているユーザーと同じ数のスレッドを実行していることを意味しますか?もしそうなら-それはリモートで実現可能ですか、それともアプリケーションを構築する適切な方法ですか?あなたがすることができたときに、どのように知っていますENDのインスタンスをstream.php
?
私の素朴な印象は、この場合、PHP はこの種のサーバーに適したテクノロジーではないということです。しかし、これまでに見てきたすべてのデモは、PHPがこれで問題ないことを暗示しています。そのため、私はとても混乱しています...