php,如何检测会话ID是死还是活?

时间:2012-06-19 15:22:11

标签: php session

  

可能重复:
  How do I expire a PHP session after 30 minutes?

如何检测会话ID是死还是活? 让我们假设有人登录 - 创建了一个新会话并保存了会话ID。如果他从另一个浏览器登录,我可以确定他已登录两次。但如何检测他是否退出?

5 个答案:

答案 0 :(得分:4)

您需要做的是当他在新浏览器上登录他的帐户时,找到与其帐户关联的旧会话ID并使其过期。当他点击退出按钮时,您可以退出该会话ID。

编辑:

抱歉,我读错了你的问题。您要做的是设置会话超时,以便在达到超时时,您认为会话已停止并使其过期。在每个页面请求中,您将更新到期日以使其生效。如果他们从另一个浏览器登录,您可以假设旧浏览器中的会话已经过时,并且会立即使其终止,或者让它在超时时间到期。

然后,您可以检查页面加载时的会话超时,或运行将通过会话数据库运行的cron脚本并使所有旧会话到期。

答案 1 :(得分:3)

当用户登录时,您应设置会话变量以表明他们已登录。

如果用户退出,您应使用session_destroy()结束会话。

这样变量就被破坏了,所以如果检查会话变量就不会这样。我个人使用$_SESSION['isLoggedIn'] = TRUE

编辑添加:如果您希望在多个浏览器或计算机上使用此功能,则需要将登录或会话ID保存到数据库,以便检查用户是否在其他位置登录。

答案 2 :(得分:3)

一般来说,“登录”的操作通常链接到某种持久层,通常是数据库服务器中用户的表/集合。

在登录时使用此保存的数据创建会话,并将保存的数据以某种方式序列化到$_SESSION超全局。

如果您想全局跟踪登录/注销,则需要保存一些用户ID(通常是电子邮件或某些登录凭据),这两个ID与两个单调递增的整数相关联,这两个整数表示他们已登录/退出的次数来自任何地方。

没有严格的规则,这必须在数据库中进行,它只是更好地扩展。对于小型或测试用例,您可以轻松保存分页文件。

主要思想是,要使任何类型的数据持续超过引用服务器上会话的session_id cookie的到期时间,您需要实现某种形式的持久性。

答案 3 :(得分:3)

用户登录时使用$ _SESSION []并将变量设置为true。如果需要,您也可以在会话变量中保存一些数据。用户单击注销后,会话变量将设置为false。代码如下:

 function Login()
    {
        if(!isset($_SESSION)){ session_start(); }
        if(!$this->CheckLoginInDB($email,$password))
        {
            return false;
        }

        $_SESSION[$this->GetLoginSessionVar()] = $email;

        return true;
    }

function GetLoginSessionVar()
    {
        $retvar = md5($this->rand_key);
        $retvar = 'usr_'.substr($retvar,0,10);
        return $retvar;
    }

    function LogOut()
        {
            session_start();

            $sessionvar = $this->GetLoginSessionVar();

            $_SESSION[$sessionvar]=NULL;

            unset($_SESSION[$sessionvar]);
        }

这是一种简单的方法。如果你想要一个时间。您可以使用$ _SESSION []变量的开始时间,然后设置超时时间。检查任何活动,直到那时为止,然后退出:

function LogOut(){
session_start();
// set timeout period. This will be in seconds.
$inactive = 1000;
// check to see if $_SESSION['timeout'] is set
if(isset($_SESSION['timeout']) ) {
    $session_life = time() - $_SESSION['start'];
    if($session_life > $inactive)
        { session_destroy(); header("Location: logoutpage.php"); }
}
$_SESSION['timeout'] = time();

}

可能有更好的方法来做到这一点。我正在寻找一种更好的方法来自己做。希望能帮助到你。

因此,如果他关闭浏览器,他会在不活动后退出。但是,如果您想在浏览器关闭后退出,请检查ini.session.cookie-lifetime

答案 4 :(得分:2)

为此您需要登录您的用户表,或者切换到在DB中存储会话,然后您可以检查针对用户的会话(如果您以这种方式进行设置)。