HTML5 Server-Sent Events (SSE)
1. サーバー送信イベント - 一方向通信
Server-Sent Events (SSE) とは、Web ページがサーバーから自動的に更新情報を受け取ることができる仕組みです。
以前からこれに近いことは可能でしたが、そのためには Web ページ側から更新があるかどうかを確認(ポーリング)しに行く必要がありました。SSE を利用すれば、サーバー側から自動的に更新内容がプッシュされます。
1.1 主な活用例
- Facebook や Twitter のタイムライン更新
- 株価のリアルタイム表示
- ニュースフィードの配信
- スポーツの試合速報
2. ブラウザのサポート状況
各ブラウザにおける Server-Sent Events のサポート状況は以下の通りです。
| API | Chrome | Edge | Firefox | Safari | Opera |
|---|---|---|---|---|---|
| Server-Sent Events | 6.0+ | 79.0+ | 6.0+ | 5.0+ | 11.5+ |
3. サーバー送信イベント通知の受信
EventSource オブジェクトを使用して、サーバー送信イベントの通知を受信します。
var source = new EventSource("demo_sse.php");
source.onmessage = function(event) {
document.getElementById("result").innerHTML += event.data + "<br>";
};3.1 コードの解説
- 新しい
EventSourceオブジェクトを作成し、更新を送信するページの URL(この例では "demo_sse.php")を指定します。 - 更新が受信されるたびに
onmessageイベントが発生します。 onmessageイベントが発生すると、受信したデータが ID "result" の要素に表示されます。
4. サーバー送信イベントのサポート確認
Web Worker の例と同様に、ブラウザがサーバー送信イベントをサポートしているかを確認するコードを記述することが推奨されます。
if (typeof(EventSource) !== "undefined") {
// Yes! Server-sent events をサポートしています。
// ここに受信用のコードを記述します。
} else {
// Sorry! Server-sent events はサポートされていません。
}5. サーバー側のコード例
SSE を動作させるには、データを送信するためのサーバーが必要です(PHP や ASP など)。
サーバー側のスクリプトはシンプルです。HTTP ヘッダーの Content-Type を text/event-stream に設定する必要があります。これで、サーバーから継続的に更新を送信できるようになります。
5.1 PHP による実装例 (demo_sse.php)
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$time = date('r');
echo "data: サーバー時刻は: {$time}\n\n";
flush();
?>5.2 サーバーコードの解説
Content-Typeをtext/event-streamに設定します。これは SSE 標準で定められた形式です。Cache-Controlを no-cache に設定し、ページがキャッシュされないようにします。- 送信するデータ行は必ず
data:で開始する必要があります。 - 出力バッファを
flush()して、データを即座にブラウザへ送信します。
6. EventSource オブジェクトのイベント
上記の例では onmessage イベントを使用してメッセージを取得しましたが、他にも利用可能なイベントがあります。
| イベント | 内容 |
|---|---|
onopen | サーバーへの接続が開かれたときに発生する |
onmessage | メッセージを受信したときに発生する |
onerror | エラーが発生したときに発生する |
これらのイベントを適切にハンドリングすることで、接続の瞬断からの復帰や、エラー時のユーザー通知など、より堅牢なリアルタイム機能を実装することが可能です。