
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{
//強制ログアウトしない場合の処理
}
?>
という仕組みでどうでしょうか。
もちろん、このログファイルに記載されるユーザー名のログイン時刻は
制御対象のページを読み込む毎に時刻を更新してやらないと
ログインしてページを見ているのに一定時間経つと強制ログアウトしてしまう事になりますので。
回答ありがとうございます。
回答内容正しいと思います。
セッション変数のタイムアウトによるログアウトの処理はこれで十分だと思います。
なのですが、すみません、最終的にやりたいことを私が書いていなかったので、申し訳ないです。
ログイン人数の制限といっても、一般に公開して大量人数のログイン上限を設定するのではなく、逆に小規模なイメージで、部屋の中にいる人間のみで使用する感じです。
例えばログイン制限人数を3人とします。セッション変数が破棄される時間を15分とします。
で、問題は、今、3人ログインしているとします。だれか1人が×ボタンでブラウザを終了する。部屋の中で見て1人空いたな、と思った4人目がログインしようとしても15分待たなければ入れない。これを回避したいのです。せめて1分後くらいにはログインできるようにしたいのです。
JavaScript の onunload() でウィンドウが閉じられたイベントを取れるようです。このとき、JavaScriptのwindow.location で、PHPの処理が埋め込まれたページをリクエストして、ウィンドウは閉じられながら、処理だけ実行される、というのは、無理な気がしています。まだちゃんとやってみてないので確かなことがいえなくて申し訳ないです。
No.3
- 回答日時:
No.1さんの方法を利用して、cronではなくログイン画面の前処理でセッション情報の整理を
してはどうでしょう。ログイン画面の<html>の前辺りに
<?php
~~セッション整理~~
?>
みたいなscriptを書いておけばいいのではないでしょうか?
No.2
- 回答日時:
たしかに JavaScript を使用することでウィンドウを閉じた場合は、カウントダウンの処理ができます。
この場合、ajaxを実装しているブラウザに限定する必要があるので、ものすごい古いブラウザは拒否する必要がありますし、JavaScript もそれぞれのブラウザに適応したコードにしなければいけません( ajax用のラ関数があります。)
しかし、タイムアウトでログインが切れた場合の処理はDBかファイルに保存した最終更新時間から判定するか, セッションタイムアウトになる前に、JavaScript でアイドルタイムの時間を観測してログアウトの警告をだすことで回避できるのではないでしょうか。
最終更新時間を保存して、ログインユーザーを確認するのはちょっと負荷が大きい気もするので、個人的には JavaScript を使用できるブラウザに限定して、ご希望のチャットルームを開くのがいいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数ページでセッションを使わ...
-
!issetの冒頭の!ビックリマー...
-
"セッションハンドラ"とは
-
セッション変数にパスワードを...
-
Excel VBA:特定の文字列以降(...
-
findstrのerrorlevel
-
wordの差し込み印刷で文字...
-
shシェルスクリプト 空白行の...
-
「取得先」という表現について
-
classの再定義エラーについて
-
EXCEL、マクロ-改ページ行番号...
-
【C#】DataGridViewの最大列数...
-
XMLのタグの有無をPHPで判定し...
-
Smarty変数の値をJavascript変...
-
VB.NETでボリュームを取得・設...
-
ps3で久しぶりにCDの音楽情報取...
-
ExcelVBAで、FileSystemObject...
-
Google scholarがひらけなくな...
-
開始と終了を指定して、その間...
-
webサイトの参考資料:サイト名 ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
セッションのスコープ(有効範...
-
ログイン画面をはさんだ後、自...
-
PHPのセッション有効期限について
-
Cookieを利用したユーザ管理
-
sessioncookieをではなくcookie...
-
Sessionの上限について
-
■(ログイン)セッションの有効期...
-
!issetの冒頭の!ビックリマー...
-
session_unsetを使う利点
-
セッション変数にパスワードを...
-
複数のサーバで運営する場合の...
-
セッション変数で定数を宣言す...
-
セッションファイルの有効期限...
-
ブラウザを閉じた後もセッショ...
-
セッション ID とセッション名...
-
別ブラウザ間でセッションの値...
-
SESSION情報は、ブラウザを起動...
-
複数ページでセッションを使わ...
-
"セッションハンドラ"とは
おすすめ情報