在浏览器关闭(PHP)上销毁会话和用户数据

在浏览器关闭(PHP)上销毁会话和用户数据,php,session,Php,Session,我知道这个问题已经被问了很多次,如何使用php跟踪网站上的在线用户,我所做的是非常基本的,如果用户登录到我的网站,我会将他们的数据保存到数据库中,一旦他们单击“注销”,我会破坏他们的会话并从数据库中删除该用户名 当用户直接关闭浏览器时,真正的问题就出现了,因为我无法对我的数据库运行mysql查询,看起来他们虽然没有登录,但仍然在登录 我不想设置任何时间来销毁Cookie或会话,因为这不是合适的方式,比如说,我将时间设置为30分钟,一个用户在一分钟内关闭了浏览器,因此他将在线显示29分钟,所以我不

我知道这个问题已经被问了很多次,如何使用php跟踪网站上的在线用户,我所做的是非常基本的,如果用户登录到我的网站,我会将他们的数据保存到数据库中,一旦他们单击“注销”,我会破坏他们的会话并从数据库中删除该用户名

当用户直接关闭浏览器时,真正的问题就出现了,因为我无法对我的数据库运行mysql查询,看起来他们虽然没有登录,但仍然在登录

我不想设置任何时间来销毁Cookie或会话,因为这不是合适的方式,比如说,我将时间设置为30分钟,一个用户在一分钟内关闭了浏览器,因此他将在线显示29分钟,所以我不希望这样

谢谢

使用web套接字,即:当用户关闭浏览器时,连接将中断,然后将其设置为脱机,但仅在现代浏览器上工作

但是,您仍然可以使用
push-stream
执行类似web套接字的操作来监视您的用户


但是,如果使用会话,可以在会话断开连接的同时设置计时器diconnect。PHP默认为15分钟(您可以自定义)。因此,如果您的用户在此时保持站点打开,但不发出请求,则在此时间之后,即使浏览器仍然打开,其会话也将关闭。

您还必须存储用户重新加载页面的时间。在进行身份验证后,单击某个链接或其他内容后,必须在数据库中存储/更新所有这些操作


在此之后,您应该检查,如果用户在15分钟前访问了站点或重新加载页面,他是否不在线。

有更好的解决方案,使用JavaScript在“onBeforeUnload”事件中向服务器发送AJAX请求。这样,脚本将确保会话和数据库记录仅在用户离开网站时删除

<script type="text/javascript">
    $(window).on('beforeunload', function() {
        $.ajax({
          url: /controller/action/clear
        });
    }); 
</script>

$(窗口).on('beforeunload',function()){
$.ajax({
url:/controller/action/clear
});
}); 

您可以使用javascript每隔{interval}ping一次用户,并在sql超时时删除您的会话。我建议不要删除,只设置为脱机,因此,用户可以在临时连接的情况下再次启动会话problems@DanSurfrider这会起作用,但每x秒一次请求的想法让我感到害怕。想象一下服务器每天必须处理的请求量……我认为您可以使用JavaScript检查用户何时关闭浏览器并发送ajax请求并更新您的databaseok我将尝试使用WebSocket,但令人震惊的是,像php这样的语言在实际应用中并不灵活all@kevin这不是PHP的限制。@Gerep:-ya可以完成,但是javascript的onbeforeload和unload方法可以在每个页面重新加载时完成,您能推荐任何只指定浏览器关闭的功能吗event@kevin这个解决方案不能保证你想要什么。有很多方法可以防止事件被发送。例如,断开连接或终止浏览器进程。无论如何,您总是需要超时检查用户浏览器。比如“保持活力”协议。这对你来说是一个很好的学习开端:这是一种方式,但并不像凯文需要的那样准确