php,如何检测会话ID是死的还是活的? [复制]

Posted

技术标签:

【中文标题】php,如何检测会话ID是死的还是活的? [复制]【英文标题】:php, how to detect is a session ID is dead or alive? [duplicate] 【发布时间】:2012-06-21 16:24:13 【问题描述】:

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

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

【问题讨论】:

您的网站上是否有退出按钮? 是的。但是他可以关闭浏览器,或者会话超时终止 是的,会话最终会超时。查看您的 php.ini - 或执行 phpinfo(),您将获得所有信息。 【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:

当用户登录并将变量设置为 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();


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

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

【讨论】:

【参考方案3】:

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

编辑:

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

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

【讨论】:

如果他没有正确注销就关闭了浏览器窗口会怎样? @DarinDimitrov 您将在新浏览器中检测到与他的帐户关联的新登录名,然后与您的用户/会话表进行交叉检查,并使他的旧会话过期。 是的,这是个好方法。 @Computer "找到旧的 sessionID [...] 并使其过期" 他为什么要这样做?这将消除同时使用多个浏览器登录的可能性。 @feeela 抱歉,我认为他的问题只希望 1 个会话处于活动状态。【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

对于任何希望将会话切换到数据库的人来说,只是一个警告 - 这会明显变慢,因此不建议在繁忙的服务器上使用。 如果您需要负载平衡并且可以在服务器之间处理一个请求,则需要,但如果您的架构配置不佳,则只会更慢。

以上是关于php,如何检测会话ID是死的还是活的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB | 比生命游戏更自由的生命游戏

MATLAB | 比生命游戏更自由的生命游戏

HTTP 保持活动状态和 TCP 保持活动状态

"三剑客”之Swarm探索应用集群服务发布

3.双活问题收集

解读设计模式