随着 session 的增加,管理已经不方便。这时,考虑使用 mysql 数据库管理。建立一个表管理 session 。 更改 session 的存储机制,让 session 不再存在文件中,而是入库。更该存储机制,只需要在文件中增加函数 session_set_save_handler() 便可。代码如下:
// 重写 session 的存储机制
function sess_open(){
echo __FUNCTION__;
}
function sess_close(){
echo __FUNCTION__;
}
function sess_read($sess_id){
echo __FUNCTION__;
}
function sess_write($sess_id, $sess_data){
echo __FUNCTION__;
}
function sess_destroy(){
echo __FUNCTION__;
}
function sess_gc(){
echo __FUNCTION__;
}
session_set_save_handler(
'sess_open',
'sess_close',
'sess_read',
'sess_write',
'sess_destroy',
'sess_gc'
);
session_start();
这要写了 session_set_save_handler() ,php 就知道要更改 session 的存储机制了。如果没写,那还是存到文件中。这函数的参数,分别对应了 session 运行机制的各个方面。参数名字,也就是函数名,可以改变,不一定这样写,这样写是为了便于阅读理解。 执行顺序也不是从上到下,而是:open -> reader -> write -> close .
————————————————————————————————————
数据库表 session 信息:
实现 session 入库功能的完整代码:
// 重写 session 的存储机制
// 最重要的三个函数: read,write,destroy 。
// 有了这几个就能完成 session 功能。
// 其他的函数的函数体可以什么都不写。
function sess_open(){
echo __FUNCTION__;
$link = mysql_connect('127.0.0.1', 'root', '');
mysql_query('set names utf8');
mysql_query('use study');
}
function sess_close(){
echo __FUNCTION__;
}
function sess_read($sess_id){
echo __FUNCTION__;
$sql = "select sess_data from `session` where sess_id = '$sess_id'";
$result = mysql_query($sql); // $link 可以自己找到,或可以声明为全局变量
if($rows = mysql_fetch_assoc($result)){
return $rows['sess_data'];
}else{
return '';
}
}
function sess_write($sess_id, $sess_data){
echo __FUNCTION__;
//当前 session 存在则更新 sess_data
//获得时间戳,mysql函数:unix_timestamp();
//获得时间戳,php函数:time();
$sql = "insert into `session` values('$sess_id', '$sess_data', now())
on duplicate key update sess_data = '$sess_data',times = now()"; //这是为了gc()
return mysql_query($sql);
}
function sess_destroy($sess_id){
echo __FUNCTION__;
$sql = "delete from `session` where sess_id = '$sess_id'";
return mysql_query($sql);
}
function sess_gc(){
echo __FUNCTION__;
}
session_set_save_handler(
'sess_open',
'sess_close',
'sess_read',
'sess_write',
'sess_destroy',
'sess_gc'
);
session_start();
var_dump($_SESSION);
$_SESSION['name'] = 'fff';
$_SESSION['age'] = '24';
//session_destroy();
——————————————————————————
总结 session 运行机制:
1. 打开 session 时,语法上执行函数 session_start() ,php 的 session 机制读取浏览器端的 cookie,语法上表示为 $_cookie['PHPSESSID']。
2. 根据 cookie 找到存储在服务器端的 session 数据。
3. 把 session 数据反序列化,赋值给变量 $_SESSION 。
4. 之后对变量 $_SESSION 的操作都是对变量的操作,不会更新 session 文件。
5. 是否执行了 session_destroy() 函数,如果执行了,那么删除服务器端的 session 文件。
6. 脚本结束时,判断是否有 sessin 文件,或者说是否执行过 session_destroy() 方法。如果没有执行过,则把 $_SESSION 变量中的数据写入到 session 文件中。如果执行过,那么什么也不做。