セッション情報をDBに保存する
$_SESSIONで読み書きができるPHPのセッション情報は、通常は/tmp/ディレクトリの下に保存されますがこれをDBで読み書きできるように切り換えます。
用意するのは以下のような単純なテーブルでよいです。
CREATE TABLE dtb_session (
sess_id text NOT NULL,
sess_data text,
create_date timestamp NOT NULL,
update_date timestamp NOT NULL
);
セッションを操作する際に呼び出される関数をユーザ定義のものに切り換える必要があるので、
以下のように関数を呼び出します。
session_set_save_handler( "sfSessOpen", "sfSessClose", "sfSessRead", "sfSessWrite", "sfSessDestroy", "sfSessGc" );また、上記で割り当てたユーザ定義の関数の中身は以下のようになります。
// セッションの有効期限(秒)
define("MAX_LIFETIME", 7200);
// セッションオープン時
function sfSessOpen($save_path, $session_name)
{
return true;
}
// セッションクローズ時
function sfSessClose()
{
return true;
}
// セッション読み込み
function sfSessRead($id)
{
$objQuery = new SC_Query();
$arrRet = $objQuery->query("SELECT sess_data FROM dtb_session WHERE sess_id = " . $id);
return($arrRet[0]['sess_data']);
}
// セッション書込み
function sfSessWrite($id, $sess_data)
{
$objQuery = new SC_Query();
$count = $objQuery->query("SELECT count(*) FOM dtb_session WHERE sess_id = " . $id);
$sqlval = array();
if($count > 0) {
// レコード更新
$sqlval['sess_data'] = $sess_data;
$sqlval['update_date'] = 'Now()';
$objQuery->update("dtb_session", $sqlval, "sess_id = ?", array($id));
} else {
// セッションデータがある場合は、レコード作成
if(strlen($sess_data) > 0) {
$sqlval['sess_id'] = $id;
$sqlval['sess_data'] = $sess_data;
$sqlval['update_date'] = 'Now()';
$sqlval['create_date'] = 'Now()';
$objQuery->insert("dtb_session", $sqlval);
}
}
return true;
}
// セッション破棄
function sfSessDestroy($id)
{
$objQuery = new SC_Query();
$objQuery->query("DELETE FROM dtb_session WHERE sess_id = " . $id);
return true;
}
// ガーベージコレクション
function sfSessGc($maxlifetime)
{
// ※php.iniで設定さえている$maxlifetimeは、利用しない。
// ユーザ定義のMAX_LIFETIME秒以上更新されていないセッションを削除する。
$objQuery = new SC_Query();
$where = "update_date < current_timestamp + '-". MAX_LIFETIME . " secs'";
$objQuery->query("DELETE FROM dtb_session WHERE " . $where);
return true;
}
ガーベージコレクションは、古いセッション情報を削除するために定期的に呼び出されます。
セッション情報を長く残しておきたい場合には、MAX_LIFETIMEを長く、すぐに消したい場合には、MAX_LIFETIMEを短く設定します。
なお、ソース内で使用されているSC_Queryは、SQL文を簡略化して実行するためのクラスです、開発環境に合わせたものに置き換えて利用してみてください。


コメント (1)
session関連で非常に困っている時に、
この記事を見つけ無事解決することが出来ました。
感謝の意味を込めてコメントしました。
有り難う御座いました☆
投稿者: taka.kami | 2008年02月03日 01:54