PHPデフォルトでは、セッション情報はファイルに保存されます。(php.iniのsession.save_pathに指定されたディレクトリ。デフォルトは”/tmp”。)
で、そのやり方は簡単で、まずphp.iniのsession.save_handlerにuserを設定。(もちろんini_set関数でもOK)
[Session]
session.save_handler = user
次に、
session_set_save_handler関数にてユーザー定義のセッション保存関数を設定。
session_set_save_handler('f_open','f_close','f_read','f_write','f_destroy','f_clean');
セッション情報を格納するDBは、以下の様な単純なテーブルを用意する。
CREATE TABLE sessions (
id INTEGER NOT NULL AUTO_INCREMENT,
sessid CHAR( 32 ) NOT NULL ,
data TEXT,
updated_at DATETIME ,
PRIMARY KEY (id) ,
UNIQUE Index_1(sessid)
)
後は、ユーザー定義のセッション保存関数を用意していくだけ。
※下記は、処理毎にDB接続してますが、とりあえず。。。
//セッションオープン時
function f_open()
{
return true;
}
//セッションクローズ時
function f_close()
{
return true;
}
//セッション読み込み時
function f_read($id)
{
$rtn = '';
$link = mysql_connect('localhost' , 'user', 'password');
$id = mysql_real_escape_string($id);
$query = "SELECT data ";
$query .= "FROM sessions ";
$query .= "WHERE sessid = '" . $id . "'";
$rs = mysql_query($query , $link);
while ($row = mysql_fetch_array($rs)) {
$rtn = $row['data'];
}
mysql_close($link);
return $rtn;
}
//セッション書き込み時
function f_write($id, $data)
{
$rtn = false;
$link = mysql_connect('localhost' , 'user', 'password');
$id = mysql_real_escape_string($id);
$data = mysql_real_escape_string($data);
$query = "REPLACE ";
$query .= "INTO sessions ";
$query .= "(sessid, data, updated_at) ";
$query .= "VALUES ('$id', '$data', NOW())";
$rs = mysql_query($query , $link);
$rtn = true;
return $rtn;
}
//セッション破棄時
function f_destroy($id)
{
$rtn = false;
$link = mysql_connect('localhost' , 'user', 'password');
$id = mysql_real_escape_string($id);
$query = "DELETE ";
$query .= "FROM sessions ";
$query .= "WHERE sessid = '" . $id . "'";
$rs = mysql_query($query , $link);
$rtn = true;
return $rtn;
}
//ガーベージコレクション時
function f_clean($maxlifetime)
{
$rtn = false;
$link = mysql_connect('localhost' , 'user', 'password');
$query = "DELETE ";
$query .= "FROM sessions ";
$query .= "WHERE updated_at < current_timestamp + '-". $maxlifetime . " secs'";
$rs = mysql_query($query , $link);
$rtn = true;
return $rtn;
}
こんな感じで関数を用意しておけば、後は「session_start()」とか「session_destroy()」とか、セッション変数に値をセットしたり値を読み込んだりとか、する度適宜に作ったセッション保存関数が呼び出され、見事にセッション情報がDBに入ります。。