Sessionのベストプラクティス

session.gc_maxlifetime

『session.gc_maxlifetime』は、セッションファイルの最終更新時刻から何秒経過したかを設定する為、 アクセスし続けるセッションに関しては、永遠に残り続けます。
秒数を設定して、強制的にセッションを削除したい場合は、下記のようにアクセス日時を記録する必要があります。

<?php
define('MAX_LIFE_TIME', 100); //100秒と設定


session_start(); //セッションを開始


if(isset($_SESSION['login_time'])){
	
	$max_life_time = $_SESSION['login_time'] + MAX_LIFE_TIME;
	
	if(time() > $max_life_time){
		/*
		// ログアウト処理
		// セッションを削除してクッキーも削除した上で
		// ログインページにリダイレクトとか。
		*/
	}
}


?>
PHPの色分け表示

クッキーの削除

また、セッションを完全に削除する場合は、残っている可能性のあるクッキーも同時に削除する必要があります。

<?php

function session_delete(){
	//session_destroy後もSESSION変数はアクセス出来るので値を削除
	$_SESSION = array();
	//Cookieが残るので削除
	if($_COOKIE[session_name()]){
		setcookie(session_name(), '', time()-42000);
	}
	//ここでやっとデストロイ(セッションファイルが削除される)
	session_destroy();
}

?>
PHPの色分け表示

デフォルトのクッキーの挙動

ちなみにデフォルトでは、COOKIEはブラウザが閉じたときに削除されてしまいます。
(IEだとメモリに保存されるようで、テンポラリディレクトリにファイルすら生成されないよう)
もしこれを一日とか設定したいなら、

<?php

$lifetime = 60 * 60 * 24; //一日

session_set_cookie_params($lifetime); //必ずsession_startする前に記述する必要がある
session_start();

?>
PHPの色分け表示
参考:http://jp.php.net/manual/ja/function.session-set-cookie-params.php

ただし、上記の設定では、session_startされた時間からXXX秒の間の有効期限を設定するものになるので、
『ユーザ認証(ログイン認証)がされた時間からXXX秒間生きているCOOKIE』を作成したい場合、問題があります。
ユーザ認証がされてから、session_startすればよいということですが、認証用のクラスライブラリなどを作った場合に
全ページにsession_startが記述されている必要がある場合など、下記のようにします。
<?php
$lifetime = 60 * 60 * 24; //一日

define('USER_ID', 'hogehoge');
define('USER_PASS', 'mogemoge');

session_start(); //とりあえず、セッションスタート

if(strtoupper($_SERVER['REQUEST_METHOD']) == 'POST'){ //POSTされてきたら~
	if(isset($_POST['uid']) && isset($_POST['upw'])){ //ちゃんとフォームのデータが飛んできてたら~
		if($_POST['uid'] == USER_ID && $_POST['upw'] == USER_PASS){ //ログインID/パスワードがあっているかを確認してー
			/*
			// ここからが該当処理
			// ログイン時刻+ライフタイムをsetcookieで記述する。
			*/
			setcookie(session_name(), session_id(), time() + $lifetime);
			
			//この後でリダイレクト処理などやりたいことを書く。
		}
	}
}


?>
PHPの色分け表示
参考:http://d.hatena.ne.jp/katase_n/20060524