我在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一样吗?谢谢

解决方案 »

  1.   

    怎么没人。现在如果直接把数据库中的session删除,那么页面就打不开了,除非是删除cookies和文件
      

  2.   

    浏览器重新打开后sessionId才会变的。你google下。我记的也不太清楚了
      

  3.   

    session表,有sessionid和sessionvalue两个字段,增加一个过期时间的字段1、获取/验证session信息时,和当前时间进行验证是否过期,过期就认为没有session,要重新生成2、写session时,将生成的当前时间+10*3600为过期时间3、实现了销毁的函数session_destroy和过期判定函数(session_gc)了吗?
    // 也就是后面的2个
    session_set_save_handler ( callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc )
      

  4.   


    销毁和过期判定函数如下        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;
    }

    这个过期没写,直接返回了。
      

  5.   


    你不写校验过期时间的逻辑,你觉得你设定过期时间还有效吗?<?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);
      

  6.   


    我在php.ini里设置的过期时间不能使用吗,必须自己写过期时间的逻辑才可以啊?
      

  7.   


    你使用的如果是php自带session存放机制的肯定有用(因为内置了过期时间机制),而现在你已经用数据库替代了php自带的,那么过期时间你也当然要实现才可以
    另外关于时间统计的问题,你完全可以在页面做一个定时的ajax访问(虽然用户没有操作,不代表你不能靠程序实现用户访问啊),就表明这个用户还是存在的,其他的和普通的一样就可以
      

  8.   

    原来如此,我前几天在QQ群上问,有个人跟我说session存数据库后过期时间还可以用php.ini里面设置的,郁闷。要是这样的话我就可以直接在gc函数里判断一下过期时间,然后处理就可以了吧。至于你说的那个定时ajax,原来我就是用这个方法,跳到另外一个页面去重新设置了session的值,但是貌似效果不太好,执行的时候会突然闪一下,影响我的计时器,莫名其妙的就停住了。
      

  9.   

    我在网上找到一篇文章,里面有一段:
    通过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后加入一个随机数是为了避免这个链接的请求被浏览器缓存。
      

  10.   


    怪了,我添加了过期函数,以一定概率来执行,但是我写的destroy函数都不运行
    function destroy($id) 
    {
    $DB = new MyOrcl();
    if($result = $DB->query("DELETE FROM SESSION_INFO WHERE SESSIONID='$id'"))
    {
    return true;
    }
    else
    {
      return false;
    }
    }