session存储机制
简单的说,session存储机制就是将$_SESSION变量数据,存入持久数据(比如文件),以及将持久数据取回来,放入$_SESSION变量的内部。回收session:是指回收机制触发的时候,将所有这个时刻已经过期的session文件数据都销毁。session存储机制的详细过程
1、当session_start()运行时开始调用自定义处理机制中的”begin”、”read”函数,并进行一次回收操作(即随机调用gc函数);
2、当脚本运行结束后-调用自定义处理机制中的”write”、”end”函数。将session数据写入、session结束了。
3、只有执行session_destory()函数时,才会调用自定义处理机制中的”delete”函数。
自定义session存储机制
我们可以人为来设定存储机制--即由我们自己定义一个session运行过程的这6个事情!第1步:声明:我们自己来进行session数据文件的处理!
Ini_set(“session.save_handler”,”user”);
Session_set_save_handler(“begin”,”end”,”read”,”write”,”delete”,”gc”);一次性设置6个函数名,分别代表session运行时要做的6个事情。
第2步:覆盖自定义存储机制的6个函数
function begin(){}
function end(){}
function read(){}
function write(){}
function delete(){}
function gc(){}
上面做完之后,后续的代码,就可以正常使用$_SESSION了,跟以前一样。对于session默认采用文件存储,一般不需要做其他处理,但对于session的其他存储方式,就需要来覆盖这6个方法,进行改变。以下我们将在sessoin入库操作中详细说明。
session入库用数据库存取session
通常文件操作读取的速度远远低于数据库的操作,特别是数据量大的时候。我们使用数据库来存储session,当然这个过程要设计session数据表。一般需要完成以下几个过程。1、定义用于session入库的数据表
create table session(
sid char(32) primary key,
sdate text,
stime int ,
key(stime)
)ENGINE=MYISAM DEFAULT CHARSET=UTF8;
2、声明使用数据库删除回收session-我们这里以把session入库操作封闭成类来说明
session_set_save_handler(
array($this,"open"),
array($this,"close"),
array($this,"read"),
array($this,"write"),
array($this,"destory"),
array($this,"gc")
);将这个函数放在session类的构造函数中。session类的构造函数如下
function __construct()
{
ini_set("session.gc_probability",1);
ini_set("session.gc_divisor",2);
ini_set("session.gc_maxlifetime",10);
ini_set("session.save_handler","user");
session_set_save_handler(
array($this,"open"),
array($this,"close"),
array($this,"read"),
array($this,"write"),
array($this,"destory"),
array($this,"gc")
);
$dsn="mysql:host=localhost;port=3306;dbname=log";
$sa=array(PDO::MYSQL_ATTR_INIT_COMMAND=>"set names utf8");
self::$obj_pdo=new pdo($dsn,"login","login@123",$sa);
}
3、覆写6个用于session处理的函数-我们仍然将这6个函数放在类中来使用
function open()
{
}
function close()
{
}
function read($sid)
{
$sql="select sdate from session where sid=".$sid;
$result=self::$obj_pdo->query($sql);
if($result)
{
$data=$result->fetchColumn();
}
return $data;
}
function write($sid,$data)
{
$sql="replace into session(sid,sdate,stime) values('".$sid."','".$data."',".time().")";
$result=self::$obj_pdo->exec($sql);
}
function destory($sid)
{
$sql="delete from session where sid='".$sid."'";
var_dump($sql);
$result=self::$obj_pdo->exec($sql);
}
function gc($maxlifetime)
{
echo '<br>gc<br>';
$sql="delete from session where now()-stime>$maxlifetime"; stime为数据表中时间对应的字段名
$result=self::$obj_pdo->exec($sql);
}
以上就是青锋建站给大家分享的session的存储机制详解与将session写入数据库中数据表的详细操作实例。青锋建站,提供专业的网站建设开发,SEO,网络营销服务。
转载请注明来源网址:青锋建站-http://www.sjzphp.com/webdis/session_store_851.html