全て、
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
あなたが同時ユーザーと同じ数のスレッドを実行していることを意味しますか?もしそうなら-それはリモートで実行可能ですか、それともアプリケーションを構築するための適切な方法ですか?そして、インスタンスをいつ終了できるかをどうやって知るのstream.php
ですか?
私の素朴な印象は、これが事実である場合、PHPはこの種のサーバーに適したテクノロジーではないということです。しかし、これまでに見たすべてのデモは、PHPがこれに適していることを示しています。そのため、私は非常に混乱しています...