2

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

 $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());
}

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

4

4 回答 4

3

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

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

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

5分钟当然可以改成你想要的值。

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

id, user_id, datetime, action, params

并放记录

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

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

于 2013-04-30T09:43:49.563 回答
2

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

现在记录用户的登录活动,当用户在论坛页面之间切换时,不断更新列,现在要检测用户是在线还是离线,last_seen您需要减去last_seen timecurrent 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 */
于 2013-04-30T09:45:13.993 回答
2

已经解释了执行此操作的传统方式(每次用户加载某些内容时更新“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>

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

于 2013-04-30T09:59:18.180 回答
1

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

于 2013-11-22T08:19:19.493 回答