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

在PHP中设置会话持续时间的正确方法是什么?,php,session,cookies,Php,Session,Cookies,通常,站点会为用户提供记住其登录名的选项,因此在会话首次启动时,它会将cookie生存期设置为零或X 为了记住这个选择,我将生存期值放在$\u SESSION变量中。但是当我想继续会话时,我无法在会话开始之前检索这个值,如果我想调用会话\u set\u cookie\u params(),我必须在之前执行 因此,当前我在继续会话时不调用session_set_cookie_params()。相反,我存储会话开始时的当前时间,并在会话继续时检查它。这是代码(注意:这是一个简化版本,原始代码包含了所

通常,站点会为用户提供记住其登录名的选项,因此在会话首次启动时,它会将cookie生存期设置为零或X

为了记住这个选择,我将生存期值放在$\u SESSION变量中。但是当我想继续会话时,我无法在会话开始之前检索这个值,如果我想调用会话\u set\u cookie\u params(),我必须在之前执行

因此,当前我在继续会话时不调用session_set_cookie_params()。相反,我存储会话开始时的当前时间,并在会话继续时检查它。这是代码(注意:这是一个简化版本,原始代码包含了所有其他需要的内容,如session\u register\u shutdown()):


这是正确的吗?如果没有,为什么还有更智能的方法来处理会话持续时间?

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


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

好吧,这并不能回答“为什么”:)为什么我不应该使用会话机制?因为:-)首先,由于会话文件的生存期,您必须增加(很多)-因此会积累比平时多得多的会话文件。然后这些文件中会有很多数据(可能?),当用户在您的页面上不活动时,您不需要存储其中的大部分数据。您是对的,我从来没有想过这一点,但是我不能修改垃圾收集器的行为,使其不删除会话,而只删除会话数据,除了生存期和开始时间?我这样问是因为在cookie中存储db id,即使是加密的,在我看来也是不安全的。会话的工作方式如下:客户机在每个请求中发送会话id,服务器查看是否找到了具有相应名称的会话文件(如果是,他会再次拾取该会话),或者他创建了一个新的会话文件。GC就是简单地删除会话文件,这样你就不能在没有会话文件的情况下保存会话。至于存储任何类型的用户id,不管是散列还是不安全的,都不如会话本身更不安全,因为两者都使用一个看起来“随机”的键,外人猜不到。问题只会是cookie窃取——但这可以通过在用户每次访问站点时使用随机salt创建一个新的hash来解决,并将新salt保存到DB中。
// 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
}