Server Sent Eventsで作るお手軽リアルタイムチャット

OVERVIEW

サーバ⇒クライアントの片方向でリアルタイム同期を実現する、「Server Sent Events」を使用してリアルタイムチャットを作成しました。

実際の稼働環境

https://x-portfolio.work/chat-sse/

GitHub: https://github.com/nison-okrock/chat-sse

概要

・CGIやPHPのように、HTTPリクエストに応じて処理を行うスクリプト言語では、WebSocketへの対応ができません。
 ※最も、CLIプロセスとしてWebSocketサーバを常駐させることができないわけではないですが、Laravelでも外部サービス(Pusher)の使用を紹介しているように、一般的に使用されているわけではありません。また、共用レンタルサーバにおいては、長時間の常駐プロセスが許されないどころか、特定のTCPポートをLISTENすることもできません。


・一方で、Server Sent Eventsという仕組みを使えば、PHPアプリケーションであっても片方向のリアルタイム通信が可能であることに着目し、実際に実装したのが本アプリケーションです。


・ブラウザ⇒サーバの通信は、単にHTTPリクエストを出せばリアルタイムに届くわけで、サーバ⇒ブラウザの通信のみリアルタイム通信にすれば、簡易にリアルタイムチャットアプリが作れる、という次第です。

工夫した点

・受信したデータの永続化のために、データベースではなくテキストファイルを使用しました。
 ⇒データの編集が無いため、JSONL形式で1レコード1行として保存しています。書き込み時は追記モードでファイルを開くため、書き込みの衝突も最小限に抑えられます。