如何跟踪我的网站用户的在线状态?

时间:2009-07-05 13:55:17

标签: session real-time

我想跟踪目前在线的用户。

在线的定义是在网站的索引页面上 有聊天功能。

到目前为止,我能想到的只是为用户设置一个cookie,当下次访问时找到cookie时,会调用ajax来更新一个表,其中包含用户名,在线状态和时间。

现在我的实际问题是,如何在离开时可靠地将其状态转为 off 网站?我唯一能想到的是设置一个没有用户交互的预定时间,然后将状态设置为 off

但我真正想要的是将状态保持在,只要它们在网站上,无论有没有互动,只有当他们离开时才转到关闭该网站。

6 个答案:

答案 0 :(得分:21)

完整解决方案。开始到结束。

如果您只希望在index.php页面上使用此功能,则可以异步(AJAX样式)向服务器发送更新,以警告$_SESSION["userid"]仍在线的服务器。

setInterval("update()", 10000); // Update every 10 seconds

function update() {
  $.post("update.php"); // Sends request to update.php
}

你的update.php文件会有一些像这样的代码:

session_start();
if ($_SESSION["userid"])
  updateUserStatus($_SESSION["userid"]);

这一切都假定您在用户登录您的网站时将您的用户ID存储为会话变量。 updateUserStatus()函数只是一个简单的查询,如下所示:

UPDATE users 
SET lastActiveTime = NOW()
WHERE userid = $userid

这样可以处理您的存储空间。现在检索“在线”用户列表。为此,您需要另一个jQuery调用,以及另一个setInterval()调用:

setInterval("getList()", 10000) // Get users-online every 10 seconds

function getList() {
  $.post("getList.php", function(list) {
    $("listBox").html(list);
  });
}

此函数每10秒从服务器请求一点HTML。 getList.php页面如下所示:

session_start();
if (!$_SESSION["userid"])
  die; // Don't give the list to anybody not logged in

$users = getOnlineUsers(); /* Gets all users with lastActiveTime within the
                              last 1 minute */

$output = "<ul>";
foreach ($users as $user) {
  $output .= "<li>".$user["userName"]."</li>";
}
$output .= "</ul>";

print $output;

这将输出以下HTML:

<ul>
  <li>Jonathan Sampson</li>
  <li>Paolo Bergantino</li>
  <li>John Skeet</li>
</ul>

该列表包含在名为“list”的jQuery变量中。回顾一下我们上一个jQuery块,你会在那里看到它。

jQuery将获取此列表,并将其放在类名为“listBox”的div中。

<div class="listBox"></div>

希望这能让你前进。

答案 1 :(得分:0)

在一般情况下,无法知道用户何时离开您的网页。

但是你可以在幕后做一些事情,以便他们在页面上经常从你的服务器加载一些东西,例如。通过加载<iframe>一些每分钟重新加载的内容:

<meta http-equiv="refresh" content="60">

这将导致一些额外的服务器负载,但它会做你想要的(如果没有到第二个)。

答案 2 :(得分:0)

那么聊天功能如何运作?它是一个基于ajax的聊天系统吗?

基于Ajax的聊天系统由客户端一直打到聊天服务器,以查看队列中是否有新消息。如果是这种情况,您可以在cookie或PHP会话中更新用户的在线状态(当然,假设您使用的是PHP)。然后,您可以将在线超时设置为略长于更新频率的内容。

也就是说,如果您的聊天系统通常每5秒钟从服务器请求一条新消息,那么您可以假设任何未发送10-15秒请求的用户不再在聊天页面上。

如果您没有使用基于Ajax的聊天系统(可能是Java或其他东西),那么您仍然可以通过添加一个定期发送到服务器的ajax请求以确定用户是否在线来完成同样的事情。

我不建议将此在线状态信息存储在数据库中。每隔几秒查询数据库以查看谁在线以及谁不在线是非常耗费资源的,特别是如果这是一个大型站点。您应该缓存此信息并在缓存(非常快)和数据库上运行(相比之下非常慢)。

答案 3 :(得分:0)

问题被标记为“jquery” - javascript解决方案怎么样?您可以使用meta/refresh代替window.setInterval(),执行ajax请求并提供“有用”的内容,例如更新的“谁在线”列表(如果您认为有用; - ))

答案 4 :(得分:0)

我还没有尝试过这个,所以请耐心等待:为window.onunload设置一个事件处理程序,当用户离开页面时通知服务器。这方面的一些问题是1.)如果浏览器或计算机崩溃,事件将不会触发,并且2.)如果用户有两个索引页面打开并关闭一个实例,除非您实现引用计数,否则它们将显示为注销。它本身并不健全,但结合Jonathan的轮询方法,应该可以让你有更好的响应时间和更新之间更大的间隔。

答案 5 :(得分:0)

最终的解决方案是使用websockets实现某些东西。