PHP/JavaScript-检测当前打开页面的用户


PHP/JavaScript - detect which users currently have the page open

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

问题是,我不知道如何判断用户何时查看页面。我想我可以告诉他们什么时候到达,什么时候离开,并相应地添加/删除。他们什么时候到达很容易判断;然而,很难判断他们何时离开,尤其是因为用户可能会打开多个选项卡,关闭其中一个,但保持另一个打开。

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

您可以使用窗口上的blurfocus事件来切换变量。然而,IE有一些怪癖,你需要解决。

作为不处理focus事件的后备措施,您可以向文档添加mousemove处理程序。这也可能会抑制自动超时,该超时仅通过在特定时间段内没有用户交互来检测焦点丢失。然而,你永远无法检测到一个分心的用户打开了网站,但却在看其他东西。。。

要检测窗口关闭,可以挂接unload事件。这可能不可靠,但当您使用Websockets时,您的服务器可以很容易地检测到关闭的连接。

好吧,有一件事你可以做,特别是如果你正在使用websocket,那就是如果你真的想的话,每隔几秒钟对服务器进行一次心跳/ping。如果你没有心跳,你就知道它们已经不在页面上了。。。。然而,得到响应并不意味着他们正在查看页面,这只意味着它是打开的,可能在另一个选项卡中。据我所知,如果用户失去对页面的关注并打开另一个标签页/窗口,则无法向服务器发送响应。

正如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

因此,你只需集思广益,就用户可能在页面上做的所有需要他们关注的事情进行思考,并将其作为你的基准。

这似乎有点激烈,我知道,可能有一些很好的方法来优化它。只是大声思考。好奇地想看看别人想出了什么。

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

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

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

您可能使用jQuery-ajaxunloadloadajax请求将在load上触发,告诉您他们正在查看,并在unload上触发,通知您他们不再查看。剩下的就交给你来弄清楚了,因为听起来你已经掌握了

注意。同样的结果应该可以在普通JS中实现。例如onunload。谷歌会找到你剩下的。