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

14 session real-time

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

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

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

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

但我真正想要的是保持状态,只要他们在网站,有或没有互动,并只去当他们离开现场.

Sam*_*son 21

完整解决方案 从开始到结束.

如果您只想在index.php页面上进行此操作,则可以异步(AJAX样式)向服务器发送更新,以警告$_SESSION["userid"]仍在线的服务器.

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

function update() {
  $.post("update.php"); // Sends request to update.php
}
Run Code Online (Sandbox Code Playgroud)

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

session_start();
if ($_SESSION["userid"])
  updateUserStatus($_SESSION["userid"]);
Run Code Online (Sandbox Code Playgroud)

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

UPDATE users 
SET lastActiveTime = NOW()
WHERE userid = $userid
Run Code Online (Sandbox Code Playgroud)

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

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

function getList() {
  $.post("getList.php", function(list) {
    $("listBox").html(list);
  });
}
Run Code Online (Sandbox Code Playgroud)

此函数每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;
Run Code Online (Sandbox Code Playgroud)

那将输出以下HTML:

<ul>
  <li>Jonathan Sampson</li>
  <li>Paolo Bergantino</li>
  <li>John Skeet</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

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

jQuery将获取此列表,并将其放在类名为"listBox"的div中.

<div class="listBox"></div>
Run Code Online (Sandbox Code Playgroud)

希望这能让你前进.


Ric*_*dle 0

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

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

<meta http-equiv="refresh" content="60">
Run Code Online (Sandbox Code Playgroud)

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