在会话超时后获取会话 ID


get session id after the session has timedout

我经营一个网站,人们可以通过不同的门户登录,而这些门户并不总是在我的域上。

当有人注销时,他们将被重定向到他们的原始门户 URL。

我将php会话超时设置为半小时,但是我遇到了一个问题,我的一些用户在超时期间在网站上处于休眠状态......因此,当他们回到他们在我的网站上所做的事情并重新加载他们不可避免地带到我的主页的页面时。

我收到了一些关于此的投诉。

作为一种可能的解决方法,我在考虑:

1 - 将会话 ID 存储在数据库中以针对用户。

2 - 当用户通过超时时运行检查,获取会话 ID 传递以查找用户是谁,然后重定向到原始门户 页。

这是好的逻辑吗?我认为我对会话ID的了解不够。超时后,会话是在浏览器上被终止,还是我仍然可以在服务器端获取它?

谢谢John

我认为

存储session_id是没有用的,因为它在超时后将无效。会话到期后,就是这样。调用 session_start() 后,将进行垃圾回收。

一些选项:

    警告用户,
  • 如果在30分钟内没有活动,那么出于"安全"目的,当前会话将被擦除,然后忘记投诉,因为它成为用户的责任。
  • cron job it,如果你不介意你的服务器做一些额外的工作,这很容易根据数据大小、会话数和运行频率$_SESSION吹它。
  • 带有要刷新setInterval()的 JS(如果需要,也可以重定向)。
  • 元刷新(如果需要,可以使用重定向)。
  • 为站点的每个用户|部分设置不同的会话超时值。这是一篇解释如何的帖子,但我从未尝试过。

每次调用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);//change the session 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;
}