Web Artisan Blog - ウェブ アルチザン ブログ

PHP:セッション情報をDBに持つ

PHP

2007年01月31日

アフィリエイトから企業サイト分析まで。訪問者の動きがまるわかりのアクセス解析サービス「リサーチアルチザンプロ」

LINEやSkypeみたいなビデオ通話がブラウザだけでできる!オンライン通話サービス「EZ-Interview - イージーインタビュー」

PHPデフォルトでは、セッション情報はファイルに保存されます。(php.iniのsession.save_pathに指定されたディレクトリ。デフォルトは”/tmp”。)
しかし、例えば以前の記事”mod_proxy_balancerの設定、特にstickysessionについて”でも触れたように、ロードバランスしたりする時など、セッション情報をDBに持つ必要がある場合があります。

で、そのやり方は簡単で、まず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に入ります。。

Web面接に最適。ブラウザだけでビデオ/音声通話ができるオンライン通話サービス。「EZ-Interview - イージーインタビュー」
訪問者録画機能も付いたシンプルで高機能なリアルタイムアクセス解析「リサーチアルチザンプロ」