在会话超时后获取会话ID

时间:2013-10-31 08:43:52

标签: php session session-timeout

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

当有人注销时,他们会被重定向到他们的原始门户网站网址。

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

我对此有一些抱怨。

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

  

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

     

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

这是好逻辑吗?我认为我对会话ID没有足够的了解...超时是在浏览器中被杀死的会话,还是我仍然可以在服务器端接收它?

谢谢, 约翰

2 个答案:

答案 0 :(得分:0)

我认为存储session_id是没用的,因为它在超时后不会有效。一旦会话到期,就是这样。一旦调用session_start(),就会发生垃圾收集。

一些选项:

  • 警告用户如果在30分钟内没有活动,那么当前会话将被清除以用于“安全”目的,然后忘记投诉,因为它变为负责任的用户。
  • cron job it,如果你不介意你的服务器做一些额外的工作,这可能会轻易打击它,具体取决于$_SESSION数据大小,会话数量和运行频率。
  • 使用setInterval()刷新JS(如果需要,还可以重定向)。
  • 元刷新(如果需要,可以重定向)。
  • 为站点的每个用户部分设置不同的会话超时值。这是一个post,解释了如何,我从未尝试过。

答案 1 :(得分:0)

每次调用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;
}