在默认情况下,php的会话数据保存在服务器的临时目录中,文件名为sessionid。
将会话信息保存到数据库有3个原因:(1)在共享主机服务器上,所有web站点都使用同一个临时目录,这意味着数十个程序都在同一个位置进行文件读取的操作,我们很容易就可以编写一个脚本从这个目录里读取所有的数据。(2)如果站点运行在多个服务器上,同一个用户在一个会话过程中可能会对不同的服务器上的多个页面产生请求,而会话数据如果保存在某台服务器上的文件里,就不能被其他服务器上的页面所使用;(3)更方便检索站点回话的信息,可以查询活动回话的数量,还可以进行备份。
第一步:创建session表。字段:会话id,会话数据,最后一次访问时间。
第二步:定义会话函数。会话包含的函数应该有:启动会话,关闭会话,读取会话数据,写入会话数据,销毁会话数据,旧会话数据被剔除(垃圾数据回收)
<?php
class SESSION
{
private $table="session" ;#表名
private $id= "id"; #表里存放会话的ID号栏名称
private $col_name = "data"; #表里存放会话的数据栏名称
private $time = "time"; #表里存放会话的时间栏名称
function__construct($table,$id,$col_name,$time)
{
$this->table =$table ? $table : $this->table;
$this->id = $id? $id : $this->id ;
$this->col_name= $col_name ? $col_name : $this->col_name ;
$this->time =$time ? $time : $this->time;
}
#打开会话
function open_session()
{
global $DB ;
$res =$DB->db_connect();
return $res ? true : false;
}
#关闭会话
function close_session()
{
global $DB ;
return $DB->db_close() ;
}
#读取会话
function read_session($id)
{
global $DB ;
if (!$id) return "";
$sql =$DB->db_select($this->table,array("{$this->col_name}"),array("{$this->id}"=>$id));
$data =$DB->db_fetch_array($sql) ;
if($DB->db_num_rows($sql)==1)
{
return$data[0][$this->col_name];
}else {
return"";
}
}
#写入数据函数
function write_session($id,$data)
{
global $DB ;
$sessArr =array("id"=>$id,"{$this->col_name}"=>$data);
return$DB->db_replace($this->table,$sessArr);
}
#销毁会话函数
function destroy($id)
{
global $DB ;
$DB->db_delete($this->table,array("{$this->id}"=>$id));
$_SESSION[]=array();
returnmysql_affected_rows($DB->db_connect);
}
#会话垃圾收集函数
function clean_session($expire)
{
global $DB ;
$sql = "delete from`{$this->table}` whereDATE_ADD({$this->time}, INTERVAL (int){$expire}SECOND ) < NOW()";
$DB->db_query($sql);
returnmysql_affected_rows($DB->db_connect());
}
#会话调用函数
function start_session()
{
session_set_save_handler('open_session','close_session','read_session','write_session','destroy_session','clear_session');
session_start();
}
}