• ベストアンサー

PHPでログイン人数を制限したい

PHPを用いたサイトを作っています。 ログイン人数の制限を行いたいのですが、どのように実現すればいいのか分からず困っています。何か良い方法を知っている方がいらっしゃったら教えていただきたく思います。お願いします。 ログイン時にセッション数を取得できれば、その時に最大人数を超えていればログインさせない、という方法でいけそうなのですが、セッション数を取得する関数はあるでしょうか? ちょっと調べたところでは分かりませんでした。 別の方法としてはログイン時にログイン人数をカウントアップしてDBかファイルに保存しておき、最大人数を超えた場合はログインさせない。ログアウト時はカウントダウンするという方法も考えましたが、問題はウィンドウを×ボタンで閉じられた場合と、タイムアウトでログインが終了した場合に、カウントダウンの処理をする方法が分かりません。そんな方法はありますでしょうか。 よい知恵を持っている方がいらっしゃったらよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

後者の方法ではログファイルに ---------------------------------------- hoge:1155601106 hoge2:1155601107 ben:1155601108 mike:1155601109 ---------------------------------------- の形式で記録しておきログイン時刻はUNIX時間で記録します。 UNIX時間は1790年1月1日からの秒数になっています。 あとは、cronなどを使い一定時間毎に ログファイルからユーザー名を一行づつ取り出し 時間を比較してログイン時刻をオーバーしているユーザーがいれば その行を削除してしまう。 例えば、2006/8/15 09:23:28なら1155601408になります。 そして、強制ログアウト時間を10分にするなら 60*10=600秒になります。 <? //途中は省いてます。 // ユーザー名を一行づつ取り出し$LoginTime変数に格納 $NowTime = time(); $LogOutTime = 60 * 10; $AutoLogOutTime = $NowTime + $LogOutTime; if($LoginTime<$AutoLogOutTime){ //強制ログアウトの処理 //ログファイルから対象ユーザーを削除 }else{ //強制ログアウトしない場合の処理 } ?> という仕組みでどうでしょうか。 もちろん、このログファイルに記載されるユーザー名のログイン時刻は 制御対象のページを読み込む毎に時刻を更新してやらないと ログインしてページを見ているのに一定時間経つと強制ログアウトしてしまう事になりますので。

michiko_
質問者

お礼

回答ありがとうございます。 回答内容正しいと思います。 セッション変数のタイムアウトによるログアウトの処理はこれで十分だと思います。 なのですが、すみません、最終的にやりたいことを私が書いていなかったので、申し訳ないです。 ログイン人数の制限といっても、一般に公開して大量人数のログイン上限を設定するのではなく、逆に小規模なイメージで、部屋の中にいる人間のみで使用する感じです。 例えばログイン制限人数を3人とします。セッション変数が破棄される時間を15分とします。 で、問題は、今、3人ログインしているとします。だれか1人が×ボタンでブラウザを終了する。部屋の中で見て1人空いたな、と思った4人目がログインしようとしても15分待たなければ入れない。これを回避したいのです。せめて1分後くらいにはログインできるようにしたいのです。 JavaScript の onunload() でウィンドウが閉じられたイベントを取れるようです。このとき、JavaScriptのwindow.location で、PHPの処理が埋め込まれたページをリクエストして、ウィンドウは閉じられながら、処理だけ実行される、というのは、無理な気がしています。まだちゃんとやってみてないので確かなことがいえなくて申し訳ないです。

その他の回答 (2)

  • tomy06
  • ベストアンサー率25% (58/224)
回答No.3

No.1さんの方法を利用して、cronではなくログイン画面の前処理でセッション情報の整理を してはどうでしょう。ログイン画面の<html>の前辺りに <?php ~~セッション整理~~ ?> みたいなscriptを書いておけばいいのではないでしょうか?

  • MrYoYoYo
  • ベストアンサー率33% (38/115)
回答No.2

たしかに JavaScript を使用することでウィンドウを閉じた場合は、カウントダウンの処理ができます。 この場合、ajaxを実装しているブラウザに限定する必要があるので、ものすごい古いブラウザは拒否する必要がありますし、JavaScript もそれぞれのブラウザに適応したコードにしなければいけません( ajax用のラ関数があります。) しかし、タイムアウトでログインが切れた場合の処理はDBかファイルに保存した最終更新時間から判定するか, セッションタイムアウトになる前に、JavaScript でアイドルタイムの時間を観測してログアウトの警告をだすことで回避できるのではないでしょうか。 最終更新時間を保存して、ログインユーザーを確認するのはちょっと負荷が大きい気もするので、個人的には JavaScript を使用できるブラウザに限定して、ご希望のチャットルームを開くのがいいと思います。

関連するQ&A

専門家に質問してみよう