ロックオン開発チームブログ -Lockon Knowledge Repositories-

セッション情報を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文を簡略化して実行するためのクラスです、開発環境に合わせたものに置き換えて利用してみてください。

Trackback

このエントリーのトラックバックURL:
http://www.lockon.co.jp/cgi-bin/mt/mt-tb.cgi/11

コメント

コメント (1)


session関連で非常に困っている時に、
この記事を見つけ無事解決することが出来ました。
感謝の意味を込めてコメントしました。
有り難う御座いました☆





Copyright(c) LOCKON CO.,LTD. All Rights Reserved.