HOME > 開発メモ > PHPとJavaScriptで擬似リアルタイムチャットを作る
2013/05/28 (2016/09/14更新) タグ: , , ,

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

  • このエントリーをはてなブックマークに追加

リアルタイムにチャットできる仕組みをPHPで作りたいと考えた時に、どうやって実現したらいいだろうと考えた。どちらか一方の発言があった時に、プルではなくプッシュで通知する仕組みが必要だ。色々と調べた結果、やり方としては大きく分けて、2つの手法に分けられるようだ。

SPONSOR

リアルタイムチャットの実現方法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について調べてみた。

で、そのWebSocketを使ったRatchetというチャットを作れるライブラリもあるようです。
Ratchet

インストールはcomposerで。

composerを使ってPHPのライブラリをもっとかんたんに管理する

参考)Ratchetを利用してPHPでWebソケット 1

お役にたちましたら、メール購読もどうぞ!

 

この記事をシェアする
  • このエントリーをはてなブックマークに追加

イリテクの最新記事をお届けします

イリテクの最新情報をチェック!
  • follow us in feedly
    RSSで最新記事を読む

イリテクで開発したサービス

こちらの記事もおすすめです

SPONSER

イリテクのプロフィール
入江 慎吾
デザインエンジニア。イリテク株式会社 代表取締役。Webシステム開発、Webサイト制作、スマートフォンアプリ開発を受託で行うほか、自社企画でクラウド見積請求書作成サービス「CLOUD PAPER」を開発・運営。仕様を決めずに少ない予算でも開発をスタートできる「月額固定のシステム開発」を実施中。(もっと詳しく
開発したWebサービス
開発したアプリ
新着記事
カテゴリ/タグ