在PHP中设置会话持续时间的正确方法是什么


What is the correct way to set the session duration for continuing it in PHP?

通常网站会向用户提供记住其登录名的选择,因此在第一次会话开始时,它会将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
}

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

设置cookie生存期并不是你必须做的唯一事情,你还必须设置session.max_lifetime——它的名称不正确,实际上是一个min生存期,它必须在最后一次访问会话文件之后通过,然后垃圾收集器才能将其从磁盘中清除。

对此,您可能根本不应该使用会话机制本身。相反,设置一个自己的cookie,让你可以再次识别登录的用户——例如,包含用户名或id,以及用秘密盐散列的用户特有的东西。如果您收到cookie值(并已验证),并且会话中还没有登录用户,请将其登录,加载所有必要的数据以放入会话中,等等。