使用session_set_save_handler做session的数据库



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

以下方法中$keysession_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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值