(PHP)セッションと認証の仕掛けで、ログイン部分のセッション管理を書きました。
これは主にセッション開始部分の話ですが、今回はログアウト時によるセッション終了の話です。
一般ユーザは自分でログアウト処理を行わない可能性もあるので、タイムアウトの仕組みも必要となります。
セッションはcookieを使うこととします。
まず、ログアウトによるセッションの破棄です。
セッション変数を空にして、セッションIDの入ったクッキーを削除し、セッションを破棄するという流れになります。(特にクッキー削除忘れやすいので要注意です)
//セション変数削除
session_unset(); //$_SESSION = array();でも可?
//クッキーからセッションID削除
if (isset($_COOKIE["PHPSESSID"])) {
setcookie("PHPSESSID", '', time() - 1800, '/');
}
//セッション削除
つぎに、タイムアウト(任意の時間操作しなかったら)したら自動的にログアウトさせる方法です。
これはちょっとまだ確約したことは言えないのですが、セッション内に最終アクセス日時の値を持たし、各ページでその日時と現在日時を比較し、閾値を超えていればタイムアウトしたことを通知するみたいな仕組みにすればいいのかと思います。
●ログインページ
//セッション開始
$_SESSION["username"] = "hoge";
$_SESSION["last_time"] = time();
●他のページ
LoginTimeoutCheck();
echo "セッション継続中";
function LoginTimeoutCheck(){
//認証できてなければログインページへ
if ( ! isset( $_SESSION["username"] ) ){
exit;
}
//タイムアウトしていればログアウト処理
if ( ! isset( $_SESSION["last_time"])
|| time() - $_SESSION["last_time"] > 10 ){
LogOut();
}
//最終表示時間更新
$_SESSION["last_time"] = time();
}
function LogOut(){
//セション変数削除
session_unset(); //$_SESSION = array();でも可?
//クッキーからセッションID削除
if (isset($_COOKIE["PHPSESSID"])) {
setcookie("PHPSESSID", '', time() - 1800, '/');
}
//セッション削除
echo "logoff";
}
また、以下のようにセッションの時間を指定やる方法もあるので、上記と併用するといいかもしれません。
//セッションの有効期限を秒数で設定(ガーベージコレクションするまでの時間)
ini_set("session.gc_maxlifetime", "1200");
//セッションのキャッシュの有効期間を分単位で指定
session_cache_expire(20);
参考:
PHPリファレンス:session_cache_expire
PHPリファレンス:session.gc-maxlifetime