通常,网站会向用户提供记住其登录信息的选择,因此会在第一次会话开始时将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
}
这是对的吗?如果没有,为什么并且有更聪明的方法来处理会话持续时间?
答案 0 :(得分:1)
设置cookie生命周期不是你必须做的唯一事情,你还必须设置session.max_lifetime
- 这个名称不正确,并且实际上是 min 生命周期,在允许垃圾收集器从磁盘清除之前,在上次访问会话文件之后传递。
你根本不应该使用会话机制本身。相反,设置一个自己的cookie,允许您再次识别登录用户 - 例如。包含用户名或ID,以及用户使用秘密盐进行哈希处理的特有内容。如果您收到该cookie值(并已经过验证)并且您的会话中已经没有登录用户 - 请将其登录,加载所有必要的数据以进入会话等。