【问题标题】:PHP/JavaScript - detect which users currently have the page openPHP/JavaScript - 检测当前打开页面的用户
【发布时间】:2012-08-02 23:30:15
【问题描述】:

我想创建一个页面,显示所有正在查看该页面的用户。理想情况下,数据库将存储页面上的用户,并在用户进入和离开时使用 websocket 进行更新。

问题是我不知道如何判断用户何时查看该页面。我在想我能够知道他们何时到达以及何时退出并相应地添加/删除。他们什么时候到达很容易判断;但是,很难判断他们何时离开 - 特别是因为用户可能会做一些事情,例如打开多个标签,关闭一个但保持另一个打开。

最好的方法是什么?我使用 PHP 作为我的服务器端语言。

【问题讨论】:

    标签: php javascript websocket


    【解决方案1】:

    您可以使用窗口上的blur and focus events 来切换变量。但是,IE does some quirks 您需要解决这个问题。

    作为不工作的focus 事件的后备方案,您可以将mousemove 处理程序添加到文档中。这也可能会限制自动超时,该超时仅通过在特定时间段内没有用户交互的事实来检测焦点丢失。但是,您将永远无法检测到一个分心的用户,该用户打开了网站但又查看了其他内容...

    要检测窗口关闭,您可以挂钩unload event。这是might be unreliable,但是当您使用 Websockets 时,您的服务器可以轻松检测到关闭的连接。

    【讨论】:

    【解决方案2】:

    嗯,你可以做的一件事,特别是如果你使用 websockets,如果你真的想要的话,每隔几秒就对服务器进行一次心跳/ping。如果你没有得到那个心跳,你知道他们不再在页面上......但是,得到响应并不意味着他们正在查看页面,它只是意味着它是打开的,可能在另一个页面上标签。如果此人失去对页面的关注并打开另一个选项卡/窗口,我不知道它会向服务器发送响应。

    【讨论】:

      【解决方案3】:

      正如 Tim 所提到的,Firefox 和 IE 将在后台选项卡中运行 javascript,因此无法通过简单的轮询来确定用户是否真的在“查看”页面,或者只是在某个地方打开了它。尽管我不知道用户是否真的在查看您的页面,但一个潜在的解决方案可能是将轮询绑定到操作。所以你可能有一些变量

      var timesincelastaction=0;
      var threshhold = 20;
      

      然后

      setInterval("timesincelastaction++",100);
      

      然后

      function keepAlive() {
        if(timesincelastaction > threshhold) {
          $.ajax(...tell the server you are alive...);
          timesincelastaction = 0;
        }
      }
      

      然后开始考虑像这样的行动

      $('a').mouseover(keepAlive);
      $('div').mouseover(keepAlive);
      $(window).scroll(keepAlive);
      $(video).play(keepAlive); // okay this isn't a real one but you get the picture
      

      因此,您只需集思广益,就用户在页面上可能会做的所有需要​​他们注意的事情进行头脑风暴,并将其作为您的基准。

      我知道这似乎有点紧张,可能有一些很好的方法可以优化它。只是大声思考。很想看看其他人的想法。

      【讨论】:

      • 那些元素不能附加其他东西” - 你的意思是什么?
      • 好点,不是很清楚,我的意思是说 $('a').mouseover 将覆盖页面上更具体的 $('a#someid').mouseover 。立即编辑。
      • 不,这不是真的。您添加一个事件处理程序,而不是覆盖现有的。
      • 哎呀,你是对的,完全删除了这个警告。谢谢:)
      【解决方案4】:

      每次运行您的某个 PHP 脚本时,都会有一些用户或实体请求查看您网站上的页面(这通常会在每次运行脚本时发生)。

      检测用户何时离开您的页面更具挑战性,这就是为什么大多数在线指标只是超时,即如果您在过去 5 分钟内没有在网站上活跃,则不再被视为在线.

      您可以使用 $_SERVER['REMOTE_ADDR'] 等变量获取有关请求页面的用户的信息,或者如果您已经拥有身份验证系统,您应该能够提取用户名,将此信息存储在数据库中用户名/IP 作为带有时间戳的唯一键,如果它们的时间戳超过 5 分钟,则根本不将其计为在线。

      【讨论】:

        【解决方案5】:

        您可能会使用 jQuery-ajaxunloadloadajax 请求将在 load 触发,告诉您他们正在查看,并在 unload 触发,告诉您他们不再查看。剩下的就留给你自己去解决,因为听起来你已经掌握了它。

        注意。在普通 JS 中应该可以实现相同的结果。如,onunload。 Google 会帮你找到剩下的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-01
          • 2016-02-21
          • 1970-01-01
          • 2023-04-09
          • 1970-01-01
          • 2012-06-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多