3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(PHP)セッション削除の話

(PHP)セッションと認証の仕掛けで、ログイン部分のセッション管理を書きました。

これは主にセッション開始部分の話ですが、今回はログアウト時によるセッション終了の話です。

一般ユーザは自分でログアウト処理を行わない可能性もあるので、タイムアウトの仕組みも必要となります。

セッションはcookieを使うこととします。

まず、ログアウトによるセッションの破棄です。

セッション変数を空にして、セッションIDの入ったクッキーを削除し、セッションを破棄するという流れになります。(特にクッキー削除忘れやすいので要注意です)

//セション変数削除

session_unset(); //$_SESSION = array();でも可?

//クッキーからセッションID削除

if (isset($_COOKIE["PHPSESSID"])) {

setcookie("PHPSESSID", '', time() - 1800, '/');

}

//セッション削除

session_destroy();

つぎに、タイムアウト(任意の時間操作しなかったら)したら自動的にログアウトさせる方法です。

これはちょっとまだ確約したことは言えないのですが、セッション内に最終アクセス日時の値を持たし、各ページでその日時と現在日時を比較し、閾値を超えていればタイムアウトしたことを通知するみたいな仕組みにすればいいのかと思います。

●ログインページ

//セッション開始

session_start();

$_SESSION["username"] = "hoge";

$_SESSION["last_time"] = time();

●他のページ

LoginTimeoutCheck();

 

echo "セッション継続中";

 

function LoginTimeoutCheck(){

session_start();

//認証できてなければログインページへ

if ( ! isset( $_SESSION["username"] ) ){

header("Location:index.php");

exit;

}

 

//タイムアウトしていればログアウト処理

if ( ! isset( $_SESSION["last_time"])

|| time() - $_SESSION["last_time"] > 10 ){

echo "タイムアウト";

LogOut();

}

//最終表示時間更新

$_SESSION["last_time"] = time();

}

 

function LogOut(){

//セション変数削除

session_unset(); //$_SESSION = array();でも可?

//クッキーからセッションID削除

if (isset($_COOKIE["PHPSESSID"])) {

setcookie("PHPSESSID", '', time() - 1800, '/');

}

//セッション削除

session_destroy();

echo "logoff";

}

また、以下のようにセッションの時間を指定やる方法もあるので、上記と併用するといいかもしれません。

//セッションの有効期限を秒数で設定(ガーベージコレクションするまでの時間)

ini_set("session.gc_maxlifetime", "1200");

//セッションのキャッシュの有効期間を分単位で指定

session_cache_expire(20);

参考:

PHPリファレンス:session_cache_expire

PHPリファレンス:session.gc-maxlifetime

セッション変数の削除とセッションIDの削除

PHPにおいて、セッションに存続時間を設定し、自動的に終了する方法を教えてください。

PHP::セッション

セッション(session)の有効期限を設定するには

PHPでセッション使用時のログアウトについて