session_set_save_handler()方法的使用案例
sql语句如下 :
CREATE TABLE `session` (
`id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,
`data` varchar(255) DEFAULT NULL,
`lapse_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
代码如下:
<?php
/**
* 参考: http://c.biancheng.net/view/8192.html
* https://blog.csdn.net/zyddj123/article/details/78906530
* 说明: 该函数的两个参数: (1) $savePath参数读取的是配置文件php.ini文件中的
* session.save_path="D:\xampp\tmp" 配置项或者通过ini_set()函数动态设置后的值; (2) $sessionName参数读取的是php.ini配置文件的
* session.name=PHPSESSID配置项或者通过ini_set()函数动态设置的后的值
*/
// 连接数据库
function sess_open($savePath, $sessionName)
{
echo "sess_open()方法<br/>";
global $link;
$link = mysqli_connect('localhost', 'root', 'root') or die('数据库连接失败!');
mysqli_select_db($link, 'test') or die('未找到该数据库!');
return true;
}
// 关闭数据库连接
function sess_close()
{
echo "sess_close()方法<br/>";
global $link;
mysqli_close($link);
return true;
}
// 读取 Session 内容
function sess_read($sessionId)
{
echo "sess_read()方法<br/>";
global $link;
$time = time();
$sql = "SELECT data FROM session WHERE id = '$sessionId' AND lapse_time > '$time'";
$result = mysqli_query($link, $sql);
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ($row) {
// return $row['data'];
return serialize($row['data']);//坑!!!需要序列化
} else {
return serialize(false);//坑!!!需要序列化
}
}
// 写入 Session
/**
* 参数 $session_id 就是当前请求的所对应的session_id; 参数 $data 就是当前的session数据序列化
* 后的值
*/
function sess_write($sessionId, $data)
{
echo "sess_write()方法<br/>";
global $link;
$lapse_time = time() + (60 * 60);
$sql = "SELECT data FROM session WHERE id = '$sessionId'";
$result = mysqli_query($link, $sql);
if (mysqli_num_rows($result) == 0) {
$ins_sql = "INSERT INTO session VALUES('$sessionId', '$data', '$lapse_time')";
$res = mysqli_query($link, $ins_sql);
} else {
$up_sql = "UPDATE session SET data = '$data', lapse_time = '$lapse_time' WHERE id = '$sessionId'";
$res = mysqli_query($link, $up_sql);
}
return $res;
}
// 删除 Session
function sess_destroy($sessionId)
{
echo "sess_destroy()方法<br/>";
global $link;
$sql = "DELETE FROM session WHERE id = '$sessionId'";
return mysqli_query($link, $sql);
}
// 清理失效的 Session
function sess_gc()
{
echo "sess_gc()方法<br/>";
global $link;
$time = time();
$sql = "DELETE FROM session WHERE lapse_time < '$time'";
$res = mysqli_query($link, $sql);
return $res;
}
//session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc');
//echo ini_get("session.save_handler") . PHP_EOL; // 返回 user
//die;
//**********************************************************************
//ini_set("session.save_handler", "user");//user代表自定义
session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc');
session_start();
$_SESSION['user'] = 'admin';
var_dump($_SESSION['user']);
浏览器访问结果如下:
数据库数据如下: