添加“在线用户”区域

时间:2014-11-22 04:31:49

标签: php sql

如何在他们离开页面或退出之前添加一个显示哪些用户在线的区域?

我考虑制作一个能够保持用户会话的表,直到他们离开页面,但我怎么能告诉他们什么时候离开?我只需要每5秒更新一次。我想在Windows的情况下远离cron作业,(Windows不支持cron吗?)

感谢您的帮助

4 个答案:

答案 0 :(得分:0)

前段时间我在其中一个应用程序中做了类似的事情。将Ajax调用绑定到某些事件,如click或mousemove。在该调用中,将时间戳写入active_users表。编写另一个函数来查询此表,并选择时间戳大于5分钟的用户。也可以通过Ajax在特定的时间间隔或者在事件中进行调用。

答案 1 :(得分:0)

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

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

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

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

或者,客户端可以每隔[predefined interval]使用心跳对服务器执行ping操作,并且服务器会知道它们在线(当用户停止发送心跳时递减计数器,假设它们已经导航)

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

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

答案 2 :(得分:0)

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

使用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数据库中的时间戳,这是一种很好的做法。这些往往很慢。

答案 3 :(得分:0)

每次用户访问某个页面时,我都使用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>';
        }
        }