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

时间:2013-07-03 10:16:45

标签: php session cookies

通常,网站会向用户提供记住其登录信息的选择,因此会在第一次会话开始时将Cookie生命周期设置为零或X.

为了记住这个选择,我将生命周期值放在$ _SESSION var中。但是当我想继续会话时,我无法在会话启动之前检索此值,如果我想调用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
}

这是对的吗?如果没有,为什么并且有更聪明的方法来处理会话持续时间?

1 个答案:

答案 0 :(得分:1)

设置cookie生命周期不是你必须做的唯一事情,你还必须设置session.max_lifetime - 这个名称不正确,并且实际上是 min 生命周期,在允许垃圾收集器从磁盘清除之前,在上次访问会话文件之后传递。

你根本不应该使用会话机制本身。相反,设置一个自己的cookie,允许您再次识别登录用户 - 例如。包含用户名或ID,以及用户使用秘密盐进行哈希处理的特有内容。如果您收到该cookie值(并已经过验证)并且您的会话中已经没有登录用户 - 请将其登录,加载所有必要的数据以进入会话等。