- phpのsessionをDBに保存する。
- sessionに期限を持たせて使いたい。cookieと同様の使い方。
- DBに保存されたdataを定期的に削除したい。
- phpのバージョンは5.3以下
その下にsessiontestを作成。その中に以下のファイルを作成。
DBSession.php db_test.php db_test2.php log.txt
tableの作成
CREATE TABLE `sessions` ( `id` int(11) NOT NULL AUTO_INCREMENT, `session_id` char(32) NOT NULL, `data` text, `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_session_id` (`session_id`), KEY `idx_created_at` (`created_at`), KEY `idx_updated_at` (`updated_at`) )DBSession.php
session.save_handler
sessionの保存先をユーザー定義に変更。
session_set_save_handlerでユーザー定義関数を指定。
名前は何でもいいですけど、わかりやすい名前がいいです。
session.gc_maxlifetime
第6引数、下記の例だとgc関数に渡される引数の時間を指定します。
ここでは100秒を指定。
gcが動く確率は gc_probability/gc_divisorで設定されます。
今回は100%動かしたいので100/100*100=100%に設定しました。
session_set_cookie_paramsには100秒を指定しました。
これでブラウザを落としても、sessionが有効になっています。
少し微妙な言い回しですけど。
<?php
ini_set('session.save_handler', 'user');
ini_set('session.gc_maxlifetime', 100);
ini_set('session.gc_probability', 100);
ini_set('session.gc_divisor', 100);
session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');
session_set_cookie_params(100);
define('HOST', "localhost");
define('USER', "root");
define('PASSWORD', "");
define('DATABASE', "development");
if(isset($_COOKIE["PHPSESSID"])){
session_id($_COOKIE["PHPSESSID"]);
}
function open(){
return true;
}
function close(){
return true;
}
function read($session_id){
$rtn = "";
$db = new mysqli(HOST, USER, PASSWORD, DATABASE);
$session_id = mysql_real_escape_string($session_id);
$select_data = "SELECT data "
. "FROM sessions "
. "WHERE session_id = '" . $session_id . "'";
$fp = fopen("log.txt", "a+");
fwrite($fp, "read: " . $select_data . "\n");
$rs = $db->query($select_data);
if($rs){
while ($row = $rs->fetch_assoc()) {
$rtn = $row['data'];
}
}
function write($session_id, $data){
$rtn = false;
$db = new mysqli(HOST, USER, PASSWORD, DATABASE);
$session_id = mysql_real_escape_string($session_id);
$data = mysql_real_escape_string($data);
$select_sessions = "SELECT * FROM sessions WHERE session_id='" . $session_id . "'";
$fp = fopen("/var/www/html/sessiontest/log.txt", "a+");
fwrite($fp, "write: " . $select_sessions . "\n");
$rs = $db->query($select_sessions);
if($rs->fetch_row() > 0){
$update_sessions = "UPDATE sessions "
. "SET data = '" . $data . "',"
. "updated_at = NOW() "
. "WHERE session_id = '" . $session_id . "'";
$rs = $db->query($update_sessions);
}else{
$insert_sessions = "INSERT INTO sessions(session_id, data, created_at)"
. "VALUES('" . $session_id . "','" . $data . "',NOW())";
$rs = $db->query($insert_sessions);
var_dump($rs);
}
$rtn = true;
return $rtn;
}
return $rtn;
}
function destroy($session_id){
$db = new mysqli(HOST, USER, PASSWORD, DATABASE);
$delete_sessions = "DELETE FROM sessions WHERE session_id = '" . $session_id . "'";
$fp = fopen("/var/www/html/sessiontest/log.txt", "a+");
fwrite($fp, "destroy: " . $delete_sessions . "\n");
$db->query($delete_sessions);
return true;
}
function gc($maxlifetime){
$rtn = false;
$db = new mysqli(HOST, USER, PASSWORD, DATABASE);
$gc_sessions = "DELETE "
. "FROM sessions "
. "WHERE updated_at < current_timestamp + '-" . $maxlifetime . " secs' "
. " OR (created_at < current_timestamp + '-" . $maxlifetime . " secs' AND updated_at IS NULL)";
$db->query($gc_sessions);
$fp = fopen("/var/www/html/sessiontest/log.txt", "a+");
fwrite($fp, "gc: " . $gc_sessions . "\n");
$rtn = true;
return $rtn;
}
db_test.php
<?php require_once 'DBSession.php'; session_start(); $_SESSION["box"] = "test"; var_dump($_SESSION);
db_test2.php
<?php require_once 'DBSession.php'; session_start(); var_dump($_SESSION); session_destroy();
0 件のコメント:
コメントを投稿