在会话超时和浏览器关闭的情况下记录用户的注销时间

时间:2012-10-08 11:43:06

标签: php mysql session browser session-timeout

  

可能重复:
  timed auto logout and browser close

我将网站的用户使用情况存储在mysql表中,我可以在登录时使用插入查询捕获和存储登录时间,如果用户选择我也会捕获注销时间通过注销按钮注销。

但是如果用户只是关闭了浏览器,那么如何解析退出时间的查询呢。

我到现在为止是这样的,但有了这个,我可以解决会话超时问题但不是“浏览器关闭”

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) 

   {

    // last request was more than 30 minates ago
      session_unset();     // unset $_SESSION variable for the runtime 
      session_destroy();   // destroy session data in storage

   }

  $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

请帮我解决这个问题..

5 个答案:

答案 0 :(得分:4)

没有可靠的方法可以知道用户已关闭浏览器或导航离开您的网站到其他地方 - 这是因为HTTP的无状态特性意味着一旦下载内容,就不再有连接服务器和浏览器(大部分)。

你可以使用一些ajax请求来“ping”你的服务器 - 一旦ping掉了,你可以假设他们关闭了你网站的所有页面。这很糟糕,因为它无用地增加了网络流量,并意味着您的服务器将处理更多的请求,而不会在功能上获得实际收益。

答案 1 :(得分:2)

使用浏览器beforeunload事件可以减少使用资源,减少中继过程。

在浏览器beforeunload事件上将ajax请求发送到服务器并插入用户注销时间。

SLAKS ** How to capture the browser window close event?的一个很好的答案是

  

只要用户离开您的网页,就会触发beforeunload事件   任何原因。

     

例如,如果用户提交表单,则单击a将触发它   链接,关闭窗口(或选项卡),或使用。转到新页面   地址栏,搜索框或书签。

     

您可以排除表单提交和超链接(除了其他   帧),使用以下代码:

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind("beforeunload", function() { 
    return inFormOrLink || confirm("Do you really want to close?"); 
})
     

live方法不适用于submit事件,因此如果添加新表单,则还需要将处理程序绑定到该表单。注意   如果不同的事件处理程序取消提交或导航,您   如果窗口实际关闭,将丢失确认提示   后来。您可以通过在提交中记录时间来解决这个问题   单击事件,并检查beforeunload是否超过a   几秒钟后。

答案 2 :(得分:1)

您无法跟踪浏览器的关闭。您可以跟踪标签的弹出或关闭。

您不能依赖beforeunload。我认为它与浏览器不兼容。

答案 3 :(得分:-1)

这是我测试过的,当浏览器关闭时它对我有用

session_start();
    if (!isset($_SESSION['LAST_ACTIVITY'])) {
        // initiate value
        $_SESSION['LAST_ACTIVITY'] = time();
    }
    if (time() - $_SESSION['LAST_ACTIVITY'] > 1800) {
        // last activity is more than 10 minutes ago
        session_destroy();
    } else {
        // update last activity timestamp
        $_SESSION['LAST_ACTIVITY'] = time();
    }

这里我存储了用户每个活动的时间戳。当时间超过30分钟时,我会进行注销(销毁会话)。

不确定您的应用程序是否允许这样做,但据我所知,这是我过去在这种情况下实现的方式

在评论后编辑

关闭浏览器不会触发对服务器的任何请求,因此您无法知道用户关闭了他的浏览器。你可以使用一个监听器来使会话超时,然后在发生这种情况时存储当前时间

通过在window.onbeforeunload上执行ajax调用或者window.onunload

,可以在关闭浏览器时与服务器通信

我的上述解决方案允许您在某些活动后的时间到期时自动注销用户

答案 4 :(得分:-2)

当用户关闭浏览器时,无论如何都会销毁会话。所以你不必破坏它。