session 入库的实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了session 入库的实现相关的知识,希望对你有一定的参考价值。

随着 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 文件中。如果执行过,那么什么也不做。

以上是关于session 入库的实现的主要内容,如果未能解决你的问题,请参考以下文章

Session 入库

session入库

NGINX实现负载均衡,并利用PHP实现session入库

php中session入库(mysql)机制

微信小程序前台的用户数据入库(后台Laravel)

在ASP中如何在用户关闭页面后自动清除SESSION?