0

通常,站点会为用户提供记住其登录信息的选项,因此它将在会话第一次开始时将 cookie 生命周期设置为零或 X。

为了记住这个选择,我将生命周期值放在 $_SESSION 变量中。但是当我想继续会话时,在会话开始之前我无法检索到这个值,如果我想调用 session_set_cookie_params() 我必须在之前这样做。

所以目前我在继续会话时不调用 session_set_cookie_params() 。相反,我存储会话开始时的当前时间,并在会话继续时检查它。这是代码(注意:这是一个简化版本,原始代码包含所有其他需要的东西,如 session_register_shutdown()):

// when I start the session

[...]

session_set_cookie_params($duration); // $duration was set before
session_start();      
$_SESSION['starttime'] = time();
$_SESSION['duration'] = $duration;


//-----------------------------------
// when I continue the session


$ok = true;

session_start();

if (isset($_SESSION['starttime']))
{
    $elapsed = $_SESSION['starttime']; - time();
    $duration = $_SESSION['duration'];
    if ($elapsed >= $duration and $duration !== 0)
    {
        $ok = false;
    }
}
else
{
    $ok = false;
}

if (! $ok)
{
    // destroy the session
}

它是否正确?如果不是,为什么以及是否有更聪明的方法来处理会话持续时间?

4

1 回答 1

1

设置 cookie 生命周期不是您唯一需要做的事情,您还必须设置session.max_lifetime- 名称不正确,实际上是最小生命周期,必须在最后一次访问会话文件之后,在垃圾收集器之前通过允许从磁盘清理它。

您可能根本不应该为此使用会话机制本身。取而代之的是,设置一个您自己的 cookie,它允许您再次识别登录的用户 - fe 包含用户名或 id,以及使用秘密盐散列的用户独有的东西。如果您收到该 cookie 值(并已对其进行验证)并且您的会话中还没有登录用户 - 登录他们,加载所有必要的数据以放入会话等。

于 2013-07-03T10:40:02.677 回答