質問: ログインの細かな実装方法について相談させてください。 ### ログインセッションが切れた場合 通常、ログインの処理があればログアウトの処理もあります。ここの実装は問題ないのですが、ログインセッションが切れて実質ログアウトとなった場合の検知方法がわかりません。 具体的には、例えば、チャットルームを作成したとします。 Aさんがログインしてチャットルームを作成します。 Aさんがログアウトした場合、チャットルームを削除(または非表示等)にします。 ではここで、ログインセッションのタイムアウトが起きた場合、同じようにチャットルームを削除したいのです。 ### 現在ログイン中のユーザの確認方法 「現在ログイン中のユーザ」の取得方法の検討がつかないため相談させてください。 上記のチャットルームの例を用いますが、AさんとBさんがチャットルームにいた場合、両名の生存確認を行いたいです。 セッションに残っているのか、いないのか。 基礎的な部分が欠乏しているかとは思いますが、皆様のお力をお借りしたく思います。 何卒よろしくお願いします。
回答: まず,まともなチャットルームを作ろうとする時点で**WebSocket**というHTTPとは別のプロトコルの利用は事実上必須です。サーバ側から能動的にデータを送れる仕組みはこれしかありません。 * Ratchetを試す - Qiita WebSocketでは,「ブラウザは開きっぱなしだけど何もしていない」という状態の場合にもハートビートと呼ばれる生存確認が行われるので,意図しない切断を回避することができます。逆に,切断されてしまった場合には `onError()` でそのことを検知できるはずです(未確認なので確認お願いします...)。「タイムアウト」を自前でやりくりするよりも,この仕組みに任せたほうが簡単だと思います。 リアルタイム更新無し,PHPのみで実現する昔ながらのチャットルームで十分,という場合はここまでしなくても構いません。その場合,1人あたりの処理は * 新規発言等の際にはHTTPリクエストを送る * 定期的にJavaScriptでハートビート相当のHTTPリクエストを送る * 何かしらHTTPリクエストを受け取ったとき,その人のセッションの有効期限を延長する という形をとるとよいでしょう。セッションを延長する方法に関しては下記を使ってください。 * ぼくのかんがえたさいきょうのsession_start - Qiita そして, **自分以外の誰かのセッション切れを検知する**,ここが少々面倒ですね。少々無駄はありますが,(ハートビートを含む)毎回のHTTPリクエストに対するレスポンスに,誰が生きているか・誰が死んだかの情報を含める必要があります。そのためには,`session_save_path()` で取得できるディレクトリ内に存在するすべてのセッションファイルに対して, 1. `filemtime()` でファイルの最終更新時刻を取得し,現在と比べて期限切れかどうかを判定 2. 期限切れであれば,該当者をタイムアウトリストに含める。セッションファイル名のみで個人の特定ができない場合は, `file_get_contents()` でファイルを取得して `session_decode()` でデコードし,必要な情報を取り出す。 という処理を行うことになると思います。 ...正直面倒ですね。素直にWebSocket使ったほうがラクな気がします。