Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/session/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 如何跟踪我的网站用户的在线状态?_Session_Real Time - Fatal编程技术网

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

Session 如何跟踪我的网站用户的在线状态?,session,real-time,Session,Real Time,我想跟踪目前在线的用户 在线的定义是当他们在网站的索引页上 具有聊天功能 到目前为止,我所能想到的只是为用户设置一个cookie,当下次访问时发现cookie时,会发出一个ajax调用,用用户的用户名、在线状态和时间更新一个表 现在我真正的问题是,他们离开时,我如何可靠地将他们的状态设置为关闭 网站?我能想到的唯一一件事是设置一个预先确定的没有用户交互的时间量,然后将状态设置为off 但我真正想要的是,只要用户在站点上,无论有无交互,状态都保持打开状态,只有当他们离开站点时才会关闭状态。一般情况

我想跟踪目前在线的用户

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

到目前为止,我所能想到的只是为用户设置一个cookie,当下次访问时发现cookie时,会发出一个ajax调用,用用户的用户名、在线状态和时间更新一个表

现在我真正的问题是,他们离开时,我如何可靠地将他们的状态设置为关闭 网站?我能想到的唯一一件事是设置一个预先确定的没有用户交互的时间量,然后将状态设置为off


但我真正想要的是,只要用户在站点上,无论有无交互,状态都保持打开状态,只有当他们离开站点时才会关闭状态。

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

但是,您可以在后台进行操作,以便他们在页面上时经常从您的服务器加载内容,例如,通过加载一个
,其中包含每分钟重新加载的内容:

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


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

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

基于Ajax的聊天系统的工作原理是客户端不断地点击聊天服务器,查看队列中是否有新消息。如果是这种情况,您可以在cookie或PHP会话中更新用户的联机状态(当然,假设您使用的是PHP)。然后可以将联机超时设置为略长于更新频率的值

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

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

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

问题被标记为“jquery”-javascript解决方案如何?而不是你可以使用,执行一个Ajax请求,并提供一些“有用的”,例如更新的“谁的在线”列表(如果你认为有用的话,-))/P>完全解决方案。从头到尾。 如果您只想在index.php页面上执行此操作,则可以异步(AJAX样式)向服务器发送更新,提醒服务器,
$\u会话[“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"]);
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;
这一切都假设当用户登录到您的网站时,您将userid存储为会话变量。updateUserStatus()函数只是一个简单的查询,如下所示:

UPDATE users 
SET lastActiveTime = NOW()
WHERE userid = $userid
这样就可以保护您的存储空间。现在检索“联机”用户列表。为此,您需要另一个jQuery调用和另一个setInterval()调用:

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

session_start();
if ($_SESSION["userid"])
  updateUserStatus($_SESSION["userid"]);
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;
session_start();
if(!$\u会话[“userid”])
死亡;//不要将列表提供给未登录的任何人
$users=getOnlineUsers();/*获取中具有lastActiveTime的所有用户
最后1分钟*/
$output=“
    ”; foreach($users作为$user){ $output.=“
  • ”$user[“userName”]。“
  • ”; } $output.=“
”; 打印$输出;
将输出以下HTML:

<ul>
  <li>Jonathan Sampson</li>
  <li>Paolo Bergantino</li>
  <li>John Skeet</li>
</ul>
  • 乔纳森·桑普森
  • 保罗·贝甘蒂诺
  • 约翰·斯基特
该列表包含在名为“list”的jQuery变量中。回顾上一个jQuery块,您将在那里看到它

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



希望这能让您顺利完成。

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

最终的解决方案是使用WebSocket实现一些功能

我从来没用过Iframe。然后我会在Iframe中每分钟更新一次mysql。我会将I框架设置为隐藏在indexpage中,而用户在Iframe中看不到页面刷新??您可以让它显示一些有用的内容,比如“N个在线用户”。那么它可以明显地自我更新是正确的。这不是一个好主意。。。最好使用javascript代码+1作为示例,并正确使用我的名字;)这里唯一的抱怨是setInterval(“update()”,10000);最好写为setInterval(更新,10000);getList也是如此。(显然,你必须在手之前声明函数)谢谢你的评论,Paolo。将“update()”调用为“update”有什么好处?这本身没有好处,只是使用timeout/interval的quote功能被认为是不好的做法。最好创建一个像setTimeout(function(){…})这样的anon函数,或者只传递您想要调用的函数名。这其实没什么大不了的,但有几个“大人物”(雷西格、克罗克福德)不喜欢我