【问题标题】:Destroying Session and User Data on browser close ( PHP)在浏览器关闭时销毁会话和用户数据(PHP)
【发布时间】:2011-12-20 13:12:24
【问题描述】:

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

真正的问题发生在用户直接关闭浏览器时,因为我无法对我的数据库运行 mysql 查询,并且看起来他们仍然登录,尽管他们没有登录。

我不想设置任何时间来销毁 cookie 或会话,因为这不是合适的方法,比如说我将时间设置为 30 分钟,而用户在一分钟内关闭了浏览器,所以他在 29 分钟内关闭了浏览器会出现在网上,所以我不想这样。

谢谢

【问题讨论】:

  • 您可以使用 javascript 每隔 {interval} 对用户执行一次 ping 操作,并在超时时删除 sql 中的会话。我建议虽然不要删除,只是设置为离线,这样用户可以在临时连接问题的情况下再次拿起会话
  • @DanSurfrider 会起作用,但每 x 秒发出一次请求的想法让我感到害怕。想象一下服务器每天必须处理的请求量......

标签: php session


【解决方案1】:

使用 web-socket 即:http://html5demos.com/web-socket 当您的用户关闭浏览器时,连接将被中断,然后您将其设置为离线,但仅适用于现代浏览器。

但是,您仍然可以使用 push-stream 执行类似 web-socket 的操作来监控您的用户。

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

【讨论】:

  • 我认为您可以使用 JavaScript 来检查用户何时关闭浏览器并发送 ajax 请求并更新您的数据库
  • 好的,我会尝试使用 web-socket,但令人震惊的是,像 php 这样的语言根本不灵活
  • @kevin 这不是 PHP 的限制。
  • @Gerep :- 可以,但是javascript的onbeforeload和unload方法在每次重新加载页面时都会这样做,你能建议任何只指定浏览器关闭事件的函数
  • @kevin 该解决方案无法确保您想要什么。有很多方法可以防止该事件被分派。喜欢,断开连接或终止浏览器进程。无论如何,您总是需要超时检查用户浏览器。就像保活协议一样。这个文档是你学习的好开始:en.wikipedia.org/wiki/Keepalive
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    在此之后,您应该检查,如果用户在大约 15 分钟前访问过网站或重新加载页面,则他不在线。

    【讨论】:

    • 这是一种方法,但它并不准确,因为凯文需要它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2012-07-29
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多