我在oracle里保存的session值,设置session超时时间为10个小时,但是过了10个小时候,数据库里保存的session信息还在,调用了unset,destroy也还在。我想问一下如何使这些session失效?我还要加上同一账号不能同时登陆的功能,表结构目前是这样的。session表,有sessionid和sessionvalue两个字段。usersession表,有sessionid和userid两个字段。每次用户登录时就先查usersession表,如果发现有userid相同的就取出对应的sessionid,到session表中删除掉响应的session信息,然后修改usersession表中的sessionid为新的sessionid。但是有个问题,就是在index.php这个页面session_start()后,产生的SID和从index.php进入另外一个页面,产生的SID一样吗?谢谢
// 也就是后面的2个
session_set_save_handler ( callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc )
销毁和过期判定函数如下 function destroy($id)
{
$DB = new MyOrcl();
if($result = $DB->query("DELETE FROM SESSIONVALUE WHERE SESSIONID='$id'")){
return true;
}
else{
return false;
}
}
/*********************************************
* WARNING - You will need to implement some *
* sort of garbage collection routine here. *
*********************************************/
function gc($maxlifetime)
{
return true;
}
这个过期没写,直接返回了。
你不写校验过期时间的逻辑,你觉得你设定过期时间还有效吗?<?php
session_start();$old_sessionid = session_id();// 是否要删除
if(要删除吗?) {
session_ destroy(); // 当前逻辑产生新的session id
session_regenerate_id(); $new_sessionid = session_id();} else { $new_sessionid = $old_sessionid;
}echo "Old Session: $old_sessionid<br />";
echo "New Session: $new_sessionid<br />";print_r($_SESSION);
我在php.ini里设置的过期时间不能使用吗,必须自己写过期时间的逻辑才可以啊?
你使用的如果是php自带session存放机制的肯定有用(因为内置了过期时间机制),而现在你已经用数据库替代了php自带的,那么过期时间你也当然要实现才可以
另外关于时间统计的问题,你完全可以在页面做一个定时的ajax访问(虽然用户没有操作,不代表你不能靠程序实现用户访问啊),就表明这个用户还是存在的,其他的和普通的一样就可以
通过JS定期的去访问页面;
利用Iframe定期的刷新页面;
直接利用程序发送HTTP请求,这样就可以避免在页面中嵌入其他的元素;下面是利用JS发送请求实现的保持SESSION不过期的实现方法,这样我们就只需要在需要SESSION保持长时间的页面(比如大表单页面)。
<script type="text/javascript">
function keepMeAlive(imgName){
myImg = document.getElementById(imgName);
if(myImg) myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());
}
window.setInterval("keepMeAlive('phpImg');", 4000);
</script>
<img id="phpImg" src="http://www.phpplot.com/phpplot/session/sess_refresh.php?" width="1" height="1" />
其中URL后加入一个随机数是为了避免这个链接的请求被浏览器缓存。
怪了,我添加了过期函数,以一定概率来执行,但是我写的destroy函数都不运行
function destroy($id)
{
$DB = new MyOrcl();
if($result = $DB->query("DELETE FROM SESSION_INFO WHERE SESSIONID='$id'"))
{
return true;
}
else
{
return false;
}
}