我想跟踪目前在线的用户.
在线的定义是在具有聊天功能的网站的索引页面上.
到目前为止,我能想到的只是为用户设置一个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)
希望这能让你前进.
一般情况下,无法知道用户何时离开您的页面。
但是您可以在幕后做一些事情,以便它们在页面上时经常从您的服务器加载某些内容,例如。通过加载<iframe>一些每分钟重新加载的内容:
<meta http-equiv="refresh" content="60">
Run Code Online (Sandbox Code Playgroud)
这将导致一些小的额外服务器负载,但它会执行您想要的操作(如果不是第二个)。
| 归档时间: |
|
| 查看次数: |
10901 次 |
| 最近记录: |