1、创建会话表
在数据库上创建简单的sessions表,
CREATE TABLE sessions(
id CHAR(32) NOT NULL,
data TEXT,
last_accessed TIMESTAMP NOT NULL,
PRIMARY KEY(id)
);
2、定义会话函数,让PHP来使用这些函数
通过调用session_set_save_handler()函数来完成。调用它需要6个参数,每个参数都是一个函数名,见表:
次序
函数被调用的时机
1
启动会话
2
关闭会话
3
读取会话数据
4
写入会话数据
5
销毁会话数据
6
旧的会话数据应该被删除(执行垃圾收集程序)
现在先根据需要建立这6个函数:
/*
*打开会话的函数
*/
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_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()函数。