添加“在线用户”区域


Add 'Online Users' area

如何添加一个区域来显示哪些用户在离开页面或注销之前处于在线状态?

我想过制作一个表格来保持用户会话,直到他们离开页面,但我如何知道他们何时离开?我只需要每 5 秒更新一次。我想远离 cron 作业,以防万一 Windows,(Windows 不支持 cron 是吗?

感谢您的任何帮助

段时间我在我们的一个应用程序中做了类似的事情。将 Ajax 调用绑定到某些事件,例如单击或鼠标移动。在该调用中,将时间戳写入active_users表。编写另一个函数来查询此表并选择时间戳早于 5 分钟的用户。通过 Ajax 在特定时间间隔或 broeser 事件中调用它。

它有很多可能的解决方案,如果你想恢复代码,你可能应该为你实现发布一些代码。

作为一个整体设计问题,您可能需要一种方法来存储内存(后端服务,内存数据库(如redis或memcached)或磁盘(常规数据库)中有多少用户在线(更多内容见下文)。

至于检测用户何时在线,这可能是一个相当困难的问题,但是假设精确到第二个数字并不重要,您可以在提供页面(PHP)或用户加载页面(Javascript)时增加数字(在上面的数据库或内存中)。

至于检测用户何时导航离开,您可以在 Javascript 中使用 onunload 处理程序,以便在用户导航离开时通知服务器。 需要注意的一个警告是,此消息可能会丢失或无法发送(即。JS关闭,浏览器崩溃等)你的计数可能会变得非常不准确。

或者,客户端可以每[predefined interval]一次心跳 ping 服务器,服务器会知道它们处于联机状态(当用户停止发送检测信号时递减计数器,假设他们已经导航离开)

基于这些高级解决方案,还可以将它们组合成一个混合解决方案,使用检测信号来检测用户是否仍在线,并使用onunload处理程序在关闭/导航时立即通知服务器。

最后,就像关于 cron 作业的说明一样,Windows 本身没有cron,但可以使用计划任务完成类似的目标。

有多种选择。这是我更喜欢的,但您的里程可能会有所不同。

使用 JavaScript 要求用户偶尔轮询/碰撞您的服务器,并使用此请求来存储哪些用户在线。使用 jQuery 的 JavaScript 部分示例:

var ajaxCall;
var livedataTimer;
function poll(timeout){
   livedataTimer = setTimeout(function(){
      if (ajaxCall != null){
         ajaxCall.abort();
      }
      if (timeout == 5){
         timeout = 10000;
      }
      ajaxCall = $.ajax({ url: '/ajax/bump.php', type: 'POST', success: function(data){
         poll(timeout);
      }, dataType: "json"});
   }, timeout);
   return livedataTimer;
}

/ajax/bump.php文件的示例:

<?php
session_start(); ## to know which user is online
## connect to your DB somewhere
mysqli_query($connection,"
   INSERT INTO `online-status`
   (`user`, `time`)
   VALUES
   (".(int)$_SESSION['user']['id'].", UNIX_TIMESTAMP())
");
return TRUE; ## return TRUE so that ajax knows the file has completed
?>

现在,要获取在线用户列表,您可以使用条件查找online-status表,例如"时间不超过 20 秒"。

最好将数据INSERT到单独的数据库中,而不是UPDATE userlist数据库中的时间戳。这些往往很慢。

每次用户访问页面时,我都使用 time(); 函数在 users 表中插入一个值,然后将其拉出并使用此功能,

        echo '<h3>Online Users</h3>';
        $query = "SELECT * FROM users";
        $data = mysqli_query($dbc, $query);
        while ($row = mysqli_fetch_array($data)){
        if(time() - 10 < $row['active']){
        echo '<a href="index.php?action=ucp&uid='.$row['uid'].'">'.$row['username'].'</a>';
        }
        }