如何在数据库中保存会话session

一、建立会话表

在数据库上建立简单的sessions表,php

CREATE TABLE sessions(
    id CHAR(32) NOT NULL,
    data TEXT,
    last_accessed TIMESTAMP NOT NULL,
    PRIMARY KEY(id)
);

二、定义会话函数,让PHP来使用这些函数

经过调用session_set_save_handler()函数来完成。调用它须要6个参数,每一个参数都是一个函数名,见表:mysql

次序 函数被调用的时机
1 启动会话
2 关闭会话
3 读取会话数据
4 写入会话数据
5 销毁会话数据
6 旧的会话数据应该被删除(执行垃圾收集程序)

如今先根据须要创建这6个函数:sql

/*
*打开会话的函数
*/
public function open_session(){
   global $sdbc;
   $sdbc = mysqli_connect('localhost','root','','test',3306);
   if($sdbc == false)
       return false;
   return true;
}

/*
*关闭会话函数
*/
public function close_session(){
   global $sdbc;
   return mysqli_close($sdbc);
}

/*
*读取会话数据的函数
*/
public function read_session($sid){
   global $sdbc;
   //query the database
    $sql = sprintf('SELECT sid FROM mb_sessions WHERE sid = "%s"',mysqli_real_escape_string($sdbc,$sid));
   $result = mysqli_query($sdbc,$sql);
   if(mysqli_num_rows($result) == 1){
       list($data) = mysqli_fetch_array($result,MYSQL_NUM);
       return $data;
   }else{
       return '';
   }
}

/*
*向数据库写入数据的函数
*$sid 会话ID
*$data 会话数据,是数组$_SESSION序列化的结果
*/
public function write_session($sid,$data){
   global $sdbc;
   $sql = sprintf('REPLACE INTO mb_sessions (sid,data) VALUES ("%s","%s")',mysqli_real_escape_string($sdbc,$sid),
   mysqli_real_escape_string($sdbc,$data));
   $result = mysqli_query($sdbc,$sql);
   if(mysqli_num_rows($result) >0)
        return true;
   else
        return false;
}

/*
*销毁会话数据的函数
*/
public function destory_session($sid){
   global $sdbc;
   $sql = sprintf('DELETE FROM mb_sessions WHERE sid = "%s"',mysqli_real_escape_string($sdbc,$sid));
   if(mysqli_num_rows(mysqli_query($sdbc,$sql)) > 0)
        return true;
   else
        return false;
}

/*
*垃圾回收函数
*/
public function clean_session($expire){
   global $sdbc;
   $q = sprintf('DELETE FROM mb_sessions WHERE DATE_ADD(last_accessed,INTERVAL %d SECOND) < NOW()',(int)$expire);
   $r = mysqli_query($sdbc,$q);
   return true;
}

使用会话处理函数:数据库

session_set_save_handler('open_session','close_session','read_session','write_session','destroy_session','clean_session');

再启动会话,注意这二者的顺序不能调换!数组

session_start();

文件保存为db_session.inc.php。浏览器

这里,须要注意如下几点:session

  • session_set_save_handler并不会启动会话,咱们还须要调用session_start()来启动。若是session_start()在以前执行,脚本中定义的处理函数就会被忽略而得不到执行。
  • 每次到新的页面能够先经过调用require_once(' db_session.inc.php '),从而简化步骤
  • 若是在PHP设置里session.auto_start = 1(意味着每一个页面将会自动启动会话),就不能使用函数session_set_save_handler()。
  • 在脚本运行结束以后,数据库链接是自动关闭的,而后会话函数会尝试向数据库写入数据并关闭链接,这样就会致使产生一系列莫名其妙的问题。为了不这些问题,咱们应该在脚本执行结束以前调用session_write_close()函数,他会调用“写入”和“关闭”函数,而这时数据库链接仍是存在的。
  • 在使用header()函数重定向浏览器以前也应该调用session_write_close()函数。
相关文章
相关标签/搜索