5

可能重复:
如何在 30 分钟后使 PHP 会话过期?

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

4

5 回答 5

5

您需要做的是,当他在新浏览器上登录他的帐户时,找到与他的帐户关联的旧 sessionID 并将其过期。当他单击注销按钮时,您可以退出该 sessionID。

编辑:

对不起,我读错了你的问题。您要做的是设置会话超时,因此如果达到超时,您将假定会话已死并使其过期。在每个页面请求上,您都将更新过期时间以使其生效。如果他们从另一个浏览器登录,您可以假设旧浏览器中的会话是旧的,并立即将其过期或让它随着超时而过期。

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

于 2012-06-19T15:26:16.427 回答
3

当用户登录时,您应该设置一个会话变量来表示他们已登录。

如果用户注销,您应该使用session_destroy()来结束会话。

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

编辑添加:如果您希望它在多个浏览器或计算机上工作,您需要将登录或会话 ID 保存到数据库,以便您可以检查用户是否在其他地方登录。

于 2012-06-19T15:26:31.947 回答
3

一般来说,“登录”的动作通常与某种持久层相关联,通常是数据库服务器中用户的表/集合。

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

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

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

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

于 2012-06-19T15:42:38.740 回答
3

当用户登录并将变量设置为 true 时使用 $_SESSION[]。如果需要,您也可以在会话变量中保存一些数据。一旦用户单击注销,将会话变量设置为 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();

}

There could be more better ways of doing this. I am looking for a better way to do it myself . Hope it helps.

So if he closes his browser he will be logged out after inactivity anyway. But if you want logout after browser is closed check ini.session.cookie-lifetime

于 2012-06-19T15:55:29.200 回答
2

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

于 2012-06-19T15:25:52.433 回答