一、建立会话表
在数据库上建立简单的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()函数。