您的位置:首页 > 数据库

使用session_set_save_handler做session的数据库

2015-10-03 00:35 585 查看
本文代码来之<<php引用开发与实践>>
前言
php版本请使用php5或以上。

为什么要用把session的数据临时放在数据库里呢?

把session文件存储在数据库后我们就可以通过后台查询,访客的访问的一些数据。

而且不用担心该数据会因为访问量而无限增大。

我们会在session_destroy回调函数清理无用数据。

函数介绍

bool session_set_save_handler(string
open,string close,string
read,string write,string
destroy,string gc);

该函数中string类型的变量其实是我们要先定义好的方法

关于他们的调用顺序,在代码中我们用echo测试

以下方法中$key是session_id(),$data代表session变量如$_SESSION['sss']="hello";

步骤

要把session数据存储到数据库里面,第一步当然是要连接数据库了,所以_session_open一定是最先调用的!

<span style="font-size:18px;">function _session_open($save_path,$session_name)
{
echo "open";<span style="background-color: rgb(255, 255, 153);">//测试调用顺序</span>
global $handle;
$handle = mysql_connect('localhost','root','111') or die('数据库连接失败');<span style="background-color: rgb(255, 255, 102);">// 连接MYSQL数据库</span>
mysql_select_db('db_database11',$handle) or die('数据库中没有此库名');<span style="background-color: rgb(255, 255, 102);">// 找到数据库</span>
return(true);
}</span>

<span style="font-size:18px;">function _session_read($key)
{

return true;
<span style="background-color: rgb(255, 255, 0);">//为了简单起见,这里不实现更好的方法</span>
}</span>

<span style="font-size:18px;">function _session_close()
{
echo "_session_close";
global $handle;
mysql_close($handle);

return(true);

}</span>


以下方法是我们的重点方法,实现的功能是:如果sesson(存在)没有过期就更新,否则添加session(session里的数据用$data这个变量代替)
<span style="font-size:18px;">function _session_write($key,$data)
{
echo "_session_write";
global $handle;
$time = 60;
<span style="background-color: rgb(255, 255, 0);">//设置失效时间为60秒,当然我们是实验时间就弄短一点</span>
$lapse_time = time() + $time;<span style="background-color: rgb(255, 255, 0);">//过期时间</span>
$t=time();//当前时间
$sql = "select session_data from tb_session where session_key = '$key' and session_time > $t";
/*
<span style="background-color: rgb(255, 255, 0);">sql语句里的session_time是数据库中的一个存储unix时间戳的值
如果它的值大于当前时间$t
说明它没有过期,没有过期$result!=0,更新session,否则,向数据库添加session
</span><span style="white-space:pre"> </span>*/
$result = mysql_query($sql,$handle);
if (mysql_num_rows($result) == 0)<span style="background-color: rgb(255, 255, 0);">//用该函数判断资源$result</span>
{
$sql = "insert into tb_session values('$key','$data','$lapse_time')";<span style="background-color: rgb(255, 255, 0);">// 插入数据库sql语句</span>
$result = mysql_query($sql,$handle);
}else
{
$sql = "update tb_session set session_key = '$key',session_data = '$data',session_time = $lapse_time where session_key = '$key'"; <span style="background-color: rgb(255, 255, 0);">// 修改数据库sql语句</span>
$result = mysql_query($sql,$handle);
}

return($result);
}</span>

用户关闭浏览器了,session摧毁了,那么数据库的数据就通过以下回调函数进行删除

<span style="font-size:18px;">function _session_destroy($key)
{
echo "_session_destroy";
global $handle;
$sql = "delete from tb_session where session_key = '$key'"; <span style="background-color: rgb(255, 255, 102);">// 删除数据库sql语句</span>
$result = mysql_query($sql,$handle);
return($result);

}</span>

除了用上述函数进行清理冗余数据,还有gc函数,如下:

<span style="font-size:18px;">function _session_gc($expiry_time)
{
echo "_session_gc";
global $handle;
$lapse_time = time(); <span style="background-color: rgb(255, 255, 102);"> // 将参数$expiry_time赋值为当前时间戳</span>
$sql = "delete from tb_session where expiry_time < $lapse_time";<span style="background-color: rgb(255, 255, 0);">//删除过期数据 </span>
$result = mysql_query($sql,$handle);
return($result);

}</span>

好了,参数方法都简单准备好了,我们调用它

<span style="font-size:18px;">session_set_save_handler('_session_open','_session_close','_session_read','_session_write','_session_destroy','_session_gc');

session_start();

$_SESSION['user'] = 'mr1111';
$_SESSION['pwd'] = 'mrsoft';</span>

ps:函数执行顺序和session_destroy()语句有关

有destroy,顺序是:open_session_read _session_destroy _session_close

没有是:open_session_read _session_write _session_close

附有数据库效果的图片

如需下载php文件和所用数据库可以

转到这里的连接:http://pan.baidu.com/s/1nt6EurZ
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php