Php 会话禁用不活动注销

Php 会话禁用不活动注销,php,session,cookies,session-cookies,setcookie,Php,Session,Cookies,Session Cookies,Setcookie,我的问题是,我的用户一直对我说“保持登录”复选框对他们不起作用(设置了Cookie/他们查看了浏览器当前的Cookie并找到了它们)。 现在我检查了两次我的代码,但我没有发现任何错误。 这是我的密码: if(isset($_POST['stay_logged_in']) == '1') { setcookie("anyusr",$username,time()+(3600*24*30)); //30 days setcookie("anytoken",$securitytoken,time()

我的问题是,我的用户一直对我说“保持登录”复选框对他们不起作用(设置了Cookie/他们查看了浏览器当前的Cookie并找到了它们)。 现在我检查了两次我的代码,但我没有发现任何错误。 这是我的密码:

if(isset($_POST['stay_logged_in']) == '1') { 
setcookie("anyusr",$username,time()+(3600*24*30)); //30 days
setcookie("anytoken",$securitytoken,time()+(3600*24*30)); //for checking
}
我是不是错过了什么?或者我应该补充点什么

其他信息

  • $\u POST['stay\u logged\u in']的值设置正确(1)
  • 用户可以关闭和重新打开浏览器并保持登录状态(2)
  • 会话是否可以比预期提前到期?我不使用任何“自动注销”功能
  • 只有在logout.php中,会话才会被销毁
  • 在linux debian服务器上使用apache2
  • 发生在现场约30分钟至1小时“不活动”后
检查会话:

if(!isset($_SESSION)) { session_start(); }
然后我用这个来检查会话是否有效

if ($_SESSION['anyusr'] != $meUser['username'] XOR
$_SESSION['anytoken'] != $meUser['superspecialneverguessedtoken']){
setcookie("anyusr","",time()-31536000);
setcookie("anytoken","",time()-31536000); 
session_unset();
session_destroy(); }
我的复选框在这里:

<input type="checkbox" id="stay_logged_in" name="stay_logged_in" value="1">

我想写这篇文章作为评论,但不得不将其作为答案分享,因为代表性较少。所以,我们开始吧。在代码中,您正在检查会话是否有效。但30分钟(或一小时)后,它会被服务器设置破坏。因此,您必须检查是否也设置了cookies。如果存在cookie或会话,则可以检查用户是否有效。类似这样的事情应该会有所帮助:

if (($_COOKIE['anyusr'] || $_SESSION['anyusr']) && ($_COOKIE['anytoken'] || $_SESSION['anytoken']))
{
    // check if user is valid
    // if valid, user is logged in
    // set your session variables with userdata again
}

您设置了cookies,但从不检查cookies。你不应该“自动登录”一个没有登录但拥有有效cookie集的用户吗?我想如果我用随机字符串检查会话就足够了。谢谢你的快速评论。但这就是问题所在,如果你想让用户在3天后保持登录状态,那么会话可能已经过期,但cookie仍然存在(除非他们清除了cookie,但这是用户的选择,而不是你的选择)。啊,好吧,这听起来很合理。我现在想试试@trpx的解决方案-再次感谢:)。事实上,这似乎是为了解决OP的问题,所以这应该是一个答案。谢谢你的回答,@trpx-我想如果我检查会话变量,这就足够了。如果问题解决了,我会编辑我的代码,然后给你一个检查过的答案(以及“prooven答案”标记)。
if (($_COOKIE['anyusr'] || $_SESSION['anyusr']) && ($_COOKIE['anytoken'] || $_SESSION['anytoken']))
{
    // check if user is valid
    // if valid, user is logged in
    // set your session variables with userdata again
}