【问题标题】:PHP Session Timeout/LogoutPHP 会话超时/注销
【发布时间】:2015-11-17 00:53:03
【问题描述】:

我试图了解 PHP 会话何时超时并​​强制用户重新登录。

当用户首次成功登录网站时,我正在设置一个全局会话,如下所示:

$_SESSION['AcmeAuthenticated'] = TRUE;

在每个其他页面上,我都会在页面顶部检查以下内容:

if (!isset($_SESSION['AcmeAuthenticated']) and $_SESSION['AcmeAuthenticated'] !== TRUE) {
 header('Location: index.php');
 die;
}

我在开发过程中注意到我可以让我的浏览器整天保持打开状态并且它不会要求我再次登录。如果我退出浏览器,它会提示我再次登录。我检查了 PHP 信息并且 session.gc_maxlifetime 设置为 900 - 我认为这意味着 PHP 会话将在 15 分钟内结束?

我是 PHP 新手,所以仍在尝试了解会话的工作原理以及超时何时生效。

【问题讨论】:

  • 您应该使用正确的比较运算符 - && 而不是 and

标签: php session


【解决方案1】:

当您退出浏览器时,它会清除所有会话。这就是为什么每次退出浏览器时都必须重新登录的原因。但是,是的,您可以设置希望 SESSION 持续多长时间。它向您展示了如何在这里: How do I expire a PHP session after 30 minutes?

【讨论】:

  • 这是一个不一定正确的传说。这取决于会话是由 cookie 处理还是通过查询字符串处理、cookie 生命周期以及客户端在关闭时是否删除 cookie(这是客户端配置,不受您的控制)。某些站点通过 AJAX 频繁更新,依此类推每次刷新会话超时都会重置,但是在浏览器窗口关闭后该功能将不存在,因此会话将过期。
  • @syck 哥们,你在浏览我的答案吗?
  • 只有一个。当我读到您认为缩进会降低脚本的可读性时,我很感兴趣的是您实际上可能拥有多少编程经验。
  • @syck 伙计。这只是个人喜好。你怎么这么固执?
【解决方案2】:

if 语句应该是:

if(!isset($_SESSION['AcmeAuthenticated']) && $_SESSION['AcmeAuthenticated'] !== true)
{
    header('Location: index.php');
    die;
}

您应该需要使用&& 而不是and。随意使用session_set_cookie_params() 来操作会话cookie 参数,但听起来你的cookie 是一个“会话”cookie;这就是为什么它在浏览器关闭后消失的原因。

【讨论】:

    【解决方案3】:

    当浏览器窗口关闭时 PHP 会话结束 [1]。

    是的,session.gc_maxlifetime 是以秒为单位设置的,所以 900 是 15 分钟。您可能希望将其提高到大约 30,000(大约 8 小时)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 2018-08-10
      • 2018-12-25
      相关资源
      最近更新 更多