本文代码来之<<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