PHPとJavaScriptで擬似リアルタイムチャットを作る

リアルタイムにチャットできる仕組みをPHPで作りたいと考えた時に、どうやって実現したらいいだろうと考えた。どちらか一方の発言があった時に、プルではなくプッシュで通知する仕組みが必要だ。色々と調べた結果、やり方としては大きく分けて、2つの手法に分けられるようだ。
リアルタイムチャットの実現方法2つ
1つ目は、Ajaxなどの技術を使い、1秒毎など定期的に更新するというもの。F5連打と同じだが、ブラウザでページ自体を更新する必要はないため、一見更新しているようには見えない。
2つ目はcometという技術を使う。これは聞いたことがなかったが、中身を知ったらその知恵に驚いた。cometはおおまかにいうと、最初にリクエストがあった際に、サーバー側でつかんだままにして、発言があったらレスポンスを返すというもの。
最初のやり方だと、発言が更新されていなくても更新を行うためムダなリクエストが発生する。これだとユーザーが増えた際に、サーバーに負荷がかかるので望ましくない。cometを使えば、データが更新された時にプッシュされるため、ムダなリクエストが発生しない。
参考プログラム
「PHPとjQueryでCometっぽいモノを実装する」こちらの記事が超参考になった。これをみていただければ、視界が晴れたように、すーっと理解できると思うが、簡単に補足解説を。
まずは、テキストファイルに保存している情報を呼び出す。
function getData() { $.post('comet.php?mode=view', {}, function(data) { $view.html(data); checkUpdate(); }); }
そうすると、comet.phpのmodeがviewの場合の処理、最新データを読み込んで返ってくる。その後、checkUpdateが実行されるが、ここがポイントで、getUpdatedDataが呼び出されている。
function getUpdatedData() { $data = getData(); $temp = $data; while ($temp === $data) { //繰り返しループして待機させる $temp = getData(); //tempに最新データを入れる sleep(1); } return $temp; //最新データを返す }
$dataには最新のファイル内容が読み込まれ、その後$tempに代入。その下で両方の値を比較し、データが同じである限り繰り返す。sleepで1秒遅延実行しているので、1秒おきに繰り返される。
そして、この間にファイルが書き込まれれば、$dataと$tempはイコールでなくなるため、ループをぬけて最新データが返ってくるというもの。その後、またcheckUpdateが実行されて、待機状態になる。の繰り返し。
このことで、ずっとPHP側で監視を続け、データが変更された場合のみ、データが返ってくる仕組みが実現されている。この技術を考えた人、凄い。
参考:CometとAjaxを利用したチャットサーバの実装
参考:第2回 Comet—プッシュ型のWebアプリケーションを作る
WebSocketでチャットを作るなら「Ratchet」
上のやり方はHTTPのロングポーリング使って無理矢理やってるパターンですが、さらに進化するとWebSocketを使う方法があります。
Webにおいて双方向通信を低コストで行う為の仕組み。インタラクティブなWebアプリケーションではサーバから任意のタイミングでクライアントに情報の送信とかしたい事があって、例えばFacebookのチャットアプリみたいに多数のクライアントが一つのページにアクセスしてて誰かがメッセージを投稿するとそれをその他のユーザーに通知したい場合があって、そういった時に双方向通信の必要性が出てくる。
元々はWebにおいてはHTTPしか通信の選択肢が無くてHTTPのロングポーリング使って無理矢理双方向通信実現したりしてたんだけど、流石に無駄が多すぎるし辛いよねって事でWebSocketというプロトコルが作られた。
WebSocketにおいては、TCP上で低コストで双方向通信が実現出来る様になってる。もちろん新しいプロトコルだからブラウザもサーバーも対応してないと使えないんだけど、最近は対応が進んでるんじゃ無いかと思う。
で、そのWebSocketを使ったRatchetというチャットを作れるライブラリもあるようです。
インストールはcomposerで。
[sc name=”engeneer”]
SHARE
PROFILE

Webサービスを作るのが大好きです。制作会社10年→フリーランス→受託をやめサービス開発に専念。プログラミングのメンターサービスMENTAは月間流通額約1,300万を突破🚀 YouTubeでは個人開発について語ってます / 「自分のサービスで生きていく」をコンセプトに個人開発オンラインサロン「入江開発室」を運営(詳しいプロフィール)