【问题标题】:PHP session lifetime problemPHP会话生命周期问题
【发布时间】:2009-07-23 18:10:35
【问题描述】:

我在这里使用 PHP5。我制作了一个登录系统,根据数据库中的记录检查用户名和密码。我想使用会话来存储记录的值。例如,当我到达我成功“登录”用户的区域时:

if($errors = 0) {
    $_SESSION['logged'] = "1";
}

问题是我希望$_SESSION['logged'] 保持活动状态,比如说 5 分钟,所以当我在这段时间之后执行if($_SESSION['logged'] == "1") 时返回 false。另外,我想在用户关闭浏览器后删除此会话。基本上,我想要一个会话配置,以便用户可以安全地离开他的办公桌,当他或某人在 10 分钟后按下刷新或在浏览器关闭后再次进入时,会话已经被删除,并且访问受到限制。

有人可以帮忙吗?谢谢。

【问题讨论】:

标签: php session


【解决方案1】:

使用session_set_cookie_params() 更改会话cookie 的生命周期。请注意,默认情况下,它设置为 0,这意味着在用户退出浏览器之前设置 cookie。您可以通过以下方式执行此操作:

/* Set to 0 if you want the session
   cookie to be set until the user closes
   the browser. Use time() + seconds
   otherwise. */

session_set_cookie_params(0);
session_start();

然后检查上次活动时间,每次有人访问页面时更新。

if(($_SESSION['lastActivity'] + 300) < time()) {
    // timeout, destroy the session.
    session_destroy();
    unset($_SESSION);
    die('Timeout!');
} else {
    $_SESSION['lastActivity'] = time();
}

【讨论】:

  • 您可以销毁cookie,但通常会话在会话被销毁之前仍然有效,PHP 通常将会话称为垃圾收集。仅当您的用户使用错误配置或恶意浏览器,或者他们的 cookie 被盗/嗅探等时,区别才有意义。
  • @Daniel Papasian: 这就是你在检查超时后死亡的原因。 cookie 仅包含会话 ID(默认情况下)。恶意用户无法修改lastActivity 时间,它使用服务器时间(因此更改客户端时间不会影响该值)。
【解决方案2】:

您为什么不设置$_SESSION['logged_time'] = time();,然后在您的应用程序中根据 time() 检查时间,而不是将其设置为 1?

如果您想真正使整个会话过期,具体细节可能会根据您的会话处理程序而改变,但对于默认会话处理程序(以及任何其他表现良好的会话处理程序),您需要查看 @987654321 @

【讨论】:

    【解决方案3】:

    您可以更改配置设置session.cookie_lifetime,例如在 php.ini 或 .htaccess 文件中:

    session.cookie_lifetime 指定 cookie 的生命周期(以秒为单位) 发送到浏览器。这 值 0 表示“直到浏览器 关闭。" 默认为 0。

    这意味着(我认为)您不能同时拥有基于超时的到期时间和浏览器关闭时的到期时间。因此,也许最好的办法是保持默认设置并按照其他人的建议在$_SESSION 中设置您自己的计时器,从而使这个答案毫无意义。

    【讨论】:

      【解决方案4】:

      只要用户停留在您的网站上,会话就会保持活跃。您必须使用 cookie 来设置特定的超时时间。

      【讨论】:

      • 我读过一次 session.gc_maxlifetime 以及它如何将会话发送到“垃圾”。我以为我可以使用这样的东西..?
      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 2016-11-21
      • 2014-08-03
      • 2012-04-07
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多