14

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

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

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

现在我的实际问题是,当他们离开网站时,我怎样才能可靠地将他们的状态关闭?我唯一能想到的就是设置一个预定的无用户交互时间,然后将状态设置为off

但我真正想要的是,只要他们在网站上,无论有没有交互,都保持状态,并且只有他们离开网站时才会关闭。

4

6 回答 6

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"]);

这一切都假设您在用户登录您的网站时将您的用户标识存储为会话变量。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>

希望这能让你继续前进。

于 2009-07-05T14:44:41.547 回答
0

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

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

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

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

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

于 2009-07-05T14:29:48.207 回答
0

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

于 2009-07-05T14:29:59.750 回答
0

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

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

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

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

于 2009-07-05T13:58:26.553 回答
0

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

于 2009-07-05T15:16:20.123 回答
0

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

于 2018-08-10T19:30:16.203 回答