【问题标题】:How to monitor users in forum page如何监控论坛页面中的用户
【发布时间】:2013-04-30 09:40:44
【问题描述】:

有没有办法监控用户在特定网页中的活动?我想做的是查看特定用户当前是否在论坛中处于活动状态,如果不处于活动状态,则该用户应显示为不在论坛中

 $sql   =   "SELECT * FROM forumlog WHERE user_id = ".$_SESSION['user_id'];
 $result    =   mysql_query($sql) or die(mysql_error());

if(mysql_num_rows($result) == 0){
        $sql   = "INSERT INTO forumlog (course_id, user_id, log_time)
                VALUES(
                ".$_GET['course_id'].",
                ".$_SESSION['user_id'].",
                ".time().")";
       $result    =   mysql_query($sql) or die(mysql_error());
}

上面的代码是我用来让用户登录论坛的,这是因为论坛只是我网站上的一个页面,在用户点击论坛链接之前他不会登录,但是我不要从论坛页面注销用户或检查用户是否在该论坛中处于活动状态

【问题讨论】:

  • 作为旁注,请考虑停止使用 mysql_query,改用 mysqli_query 的 PDO,因为 mysql_query 现在已弃用 php.net/manual/en/function.mysql-query.php
  • 是的,谢谢,我会努力的
  • 认为您只需要检查该用户的 log_time 在 X 分钟内的用户(假设您每次执行任何操作时都更新 log_time)。

标签: php javascript html mysql


【解决方案1】:

当用户进入页面时,您可以将时间放入数据库。每次他刷新页面时,您都应该更新一次。

要检查哪些用户处于活动状态,您必须从“时间”小于 5 分钟的数据库用户中进行选择。

要检查哪些用户缺席,您需要检查用户是否超过 5 分钟。

5 分钟当然可以更改为您想要的值。

如果您想更具体一些,您可以在您的网站上命名操作并将其放入数据库中,如下结构:

id, user_id, datetime, action, params

并放置记录

1, NOW(), 4,  "viewforum", "forum_id=4,post_id=6"

然后你可以选择最近5分钟的活动并通过user_id查看谁在线。

【讨论】:

  • 问题是我让超过 90% 的论坛页面异步,所以用户刷新页面的唯一时间是当他们试图离开论坛页面时
  • 异步请求由可以更新数据库的服务器处理。
  • 所以对于每个活动,我都会有一个更新该数据库列的代码?
  • 如果您想监控每个活动,那么是的,如果您只想查看用户是否处于活动状态,那么您应该按照 Alien 先生在每次用户活动期间的建议更新 1 个字段,例如在 users_table 中。
【解决方案2】:

你可以这样做,在你的数据库中有一个last_seen 列,可能是用户列

现在记录用户的登录活动,当用户在论坛页面之间切换时,不断更新last_seen列,现在要检测用户是在线还是离线你需要从current time中减去last_seen time

if(strtotime($current_time) - strtotime($last_seen) < 60) { //60 Seconds /1 minute
   echo 'User Is Online';
} else {
   echo 'User Is Offline';
}
/* This will mark users online if they 
   were active before a minute, certainly you can extend it to 2-3 minutes  
   i.e 120/180 sec */

【讨论】:

    【解决方案3】:

    已经解释了执行此操作的传统方式(每次用户加载某些内容时更新“last_activity”字段)。

    我将指出一种完全不同的方法:websockets

    如您所知,http 以请求-响应方式工作。连接由客户端创建,并在发送响应后关闭(嗯,并非总是如此,取决于keepalive)。因此,除非您接受这一点,否则您的问题(“我怎么知道用户是否还在?”)无法解决:“如果用户没有请求更多内容,请考虑他不在线了”。

    好吧,websockets 在这里有一个优势,因为在客户端或服务器决定断开连接之前连接不会关闭。因此,您可以在用户进入论坛时打开连接,并将其保留在那里,直到客户端离开页面或关闭浏览器,从而关闭连接。

    坏消息:您必须编写一个服务器来监听这些连接。例如使用 Node.js。不难,但是你需要root访问服务器,然后写几行代码。

    传统的方式比较简单,就是一个sql查询,不过了解一下替代方案还是不错的。

    编辑

    快速示例

    1. 安装 Node.js:http://nodejs.org/
    2. 安装socket.io(它是一个node.js模块):http://socket.io/
    3. 像这样编写一个简单的服务器:
    var socketsConnected = 0;
    var io = require('socket.io').listen(8080);
    io.sockets.on('connection', function (socket) {
        socketsConnected++;
        // send him some information
        socket.emit('totalSocketsOnline', { counter: socketsConnected });
        // let the others know that the counter has changed!
        socket.broadcast.emit('totalSocketsOnline', { counter: socketsConnected });
    
        // socket events
        socket.on('disconnect', function () {
            console.log("Socket disconnected");
            socketsConnected--;
            // again, notify all clients!
            socket.broadcast.emit('totalSocketsOnline', { counter: socketsConnected });
        });
    });
    

     4- 像这样编写一个简单的客户端:

    <script src="http://yourdomain.com:8080/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect('http://yourdomain.com:8080');
        socket.on('connect', function (data) {
            // connected, we are so happy...
        });
        socket.on('totalSocketsOnline', function (data) {
            // wohohoo lets show how many sockets we have online now
            alert("We have "+data['counter']+" sockets online now!");
        });
    </script>
    

    我刚刚编写了代码,因此它可能包含错误并且无法正常工作,但这是一个开始的地方。

    【讨论】:

    • 你有链接可以带我去哪里学习如何工作,听起来不错。谢谢..
    • 我已经用一个例子更新了答案。但是那里有很多很好的 Node.js 教程。
    • 非常感谢,这将有很长的路要走
    • 这只是一个例子,您可能不想计算“sockets”而是计算“users”。您可能不想计算“客人”。此外,如果用户让浏览器保持打开状态 1 小时,您可能希望服务器关闭连接...所以放轻松,您可以改进很多呵呵。
    • 还有一点值得记住的是,大部分浏览器都不支持 Web Sockets,如果它们不可用,我会考虑实施一些备用方案。
    【解决方案4】:

    如果您能承受一点压力,您可以使用轮询与服务器建立开放连接,并在 30 秒内返回鼠标的数组位置,如果该位置与前 30 秒保持相同,那么您会得出用户当前不活跃的结论。并且可以制作一个脚本来注销用户.....好吧,我只是说......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      相关资源
      最近更新 更多