当前位置: 首页 > 面试题库 >

PHP中的会话超时:最佳实践

督坚白
2023-03-14
问题内容

session.gc_maxlifetime和之间的实际区别是session_cache_expire()什么?

假设我希望用户会话在闲置15分钟后无效(而不是在第一次打开后15分钟内无效)。其中哪一项对我有帮助?

我也知道我可以这样做session_set_cookie_params(),可以将用户的Cookie设置为在一定时间内过期。但是,cookie过期与服务器端的实际会话过期是不相同的。Cookie过期后,这还会删除会话吗?

我的另一个解决方案是$_SESSION['last_time'] = time() 对每个请求都很简单
,然后将会话与当前时间进行比较,然后基于该时间删除会话。我希望有更多的“内置”机制来处理此问题。

谢谢。


问题答案:

每次调用session_start时,都会更新会话文件的时间戳(如果存在),该时间戳用于计算是否超过了session.gc_maxlifetime。

更重要的是,在超过session.gc_maxlifetime时间之后,您不能依赖会话过期。

PHP在当前会话加载后,在过期的会话上运行垃圾回收,并通过使用session.gc_probability和session.gc_divisor来计算垃圾回收将运行的可能性。默认情况下,其概率为1%。

如果访问者数量少,则闲置的用户可能会访问应该已过期并已删除的会话。如果这对您很重要,则需要在会话中存储时间戳并计算用户不活动的日志方式。

此示例替换session_start并强制超时:

function my_session_start($timeout = 1440) {
    ini_set('session.gc_maxlifetime', $timeout);
    session_start();

    if (isset($_SESSION['timeout_idle']) && $_SESSION['timeout_idle'] < time()) {
        session_destroy();
        session_start();
        session_regenerate_id();
        $_SESSION = array();
    }

    $_SESSION['timeout_idle'] = time() + $timeout;
}


 类似资料:
  • 问题内容: 我在用户登录时创建会话,如下所示: 如何在X分钟的会话上指定超时,然后在达到X分钟后让它执行功能或页面重定向? 编辑:我忘了提及由于不活动,我需要会话超时。 问题答案: 首先,存储用户最后一次发出请求的时间 在后续请求中,检查他们多久之前提出了请求(在此示例中为10分钟)

  • 问题内容: 默认情况下,PHP会话是否超时-即,如果我没有任何编码,最终在一段时间不活动后最终将“注销”用户吗? 问题答案: 这取决于服务器配置或相关指令的session.gc_maxlifetime在。 通常情况下,默认值为24分钟(1440秒),但是您的虚拟主机可能已将默认值更改为其他值。

  • 在 HTTP 协议中,当客户端不再处于活动状态时没有显示的终止信号。这意味着当客户端不再处于活跃状态时可以使用的唯一机制是超时时间。 Servlet 容器定义了默认的会话超时时间,且可以通过 HttpSession 接口的 getMaxInactiveInterval 方法获取。开发人员可以使用HttpSession 接口的 setMaxInactiveInterval 方法改变超时时间。这些方法

  • 问题内容: 我想在php中延长会话超时 我知道可以通过修改php.ini文件来实现。但我无权访问。 那么有可能只用php代码来做到吗? 问题答案: 如果需要严格的保证,会话超时是必须在代码中实现的概念。这是 唯一的办法 ,你可以绝对肯定的是,没有永远的会话将不活动的X分钟后存活。 如果稍微放松一下此要求是可以接受的,并且可以设置 下限 而不是严格的持续时间,那么您可以轻松地做到这一点,而无需编写自

  • PHP 是一门复杂的语言,经过多年折腾,使其不同版本之间高度不一致,有时还有些 bug。每个版本都有自己独有的特性、多余和怪异之处,也很难跟踪哪个版本有哪些问题。

  • 问题内容: Go没有工会。但是工会在很多地方都是必要的。XML过度使用联合或选择类型。我试图找出答案,这是解决缺少的工会的首选方法。作为一个例子,我试图写Go代码对于非终端在XML标准,其可以是一个注释,一个处理指令或白空间。 为这三种基本类型编写代码非常简单。它们映射到字符数组和结构。 但是,当我完成联合的代码时,它变得with肿了许多冗余功能。显然必须有一个容器结构。 为了确保容器仅包含三个允