我想制作一个页面,显示所有正在查看该页面的用户。理想情况下,数据库将存储页面上的用户,并且当用户进入和离开时,websockets 将用于更新。
问题是我不知道如何判断用户何时查看该页面。我在想我能够知道他们何时到达以及何时退出并相应地添加/删除。他们什么时候到达很容易判断;然而,很难判断他们什么时候离开——尤其是因为用户可能会做一些事情,比如打开多个标签,关闭一个但保持另一个打开。
做这个的最好方式是什么?我使用 PHP 作为我的服务器端语言。
我想制作一个页面,显示所有正在查看该页面的用户。理想情况下,数据库将存储页面上的用户,并且当用户进入和离开时,websockets 将用于更新。
问题是我不知道如何判断用户何时查看该页面。我在想我能够知道他们何时到达以及何时退出并相应地添加/删除。他们什么时候到达很容易判断;然而,很难判断他们什么时候离开——尤其是因为用户可能会做一些事情,比如打开多个标签,关闭一个但保持另一个打开。
做这个的最好方式是什么?我使用 PHP 作为我的服务器端语言。
您可以使用窗口上的blur
和focus
事件来切换变量。然而, IE 有一些你需要解决的怪癖。
作为不工作focus
事件的后备,您可以mousemove
向文档添加处理程序。这也可能会限制自动超时,该超时仅通过在特定时间段内没有用户交互的事实来检测焦点丢失。但是,您将永远无法检测到一个分心的用户,该用户打开了站点,但正在查看其他内容……
要检测窗口关闭,您可以挂钩unload
事件。这可能不可靠,但是当您使用 Websockets 时,您的服务器可以轻松检测到关闭的连接。
好吧,你可以做的一件事,特别是如果你使用 websockets,如果你真的想要的话,每隔几秒就对服务器进行一次心跳/ping。如果你没有得到那个心跳,你知道他们不再在页面上......但是,得到响应并不意味着他们正在查看页面,它只是意味着它是打开的,可能在另一个页面上标签。如果此人失去对页面的关注并打开另一个选项卡/窗口,我不知道它会向服务器发送响应。
正如蒂姆所提到的,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 分钟,则根本不将它们视为在线。