有没有办法监控特定网页中的用户活动?我想要做的是查看特定用户当前是否在论坛中处于活动状态,如果未激活,则该用户应显示为缺席论坛
$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());
}
以上代码是我用来将用户登录到论坛的原因,这是因为论坛只是我网站上的一个页面,直到用户点击论坛链接他才会登录,但后来我不要如何从论坛页面注销用户或检查用户是否在该论坛中处于活动状态
答案 0 :(得分:3)
当用户输入页面时,您可以将时间放在数据库中。每当他刷新页面时你都应该更新这次。
要检查哪些用户处于活动状态,您必须从数据库用户中选择“时间”少于5分钟。
要检查哪些用户不在,您需要检查用户,而不是时间超过5分钟。
当然5分钟可以改为你想要的价值。
如果您想更具体一点,您可以在您的网站上命名操作并将其放入数据库中,如:
id, user_id, datetime, action, params
并记录
1, NOW(), 4, "viewforum", "forum_id=4,post_id=6"
然后您可以在过去5分钟内选择活动,并通过在线的user_id进行检查。
答案 1 :(得分:2)
您可以这样做,在您的数据库中有一个last_seen
列,可能是用户列
现在记录用户的登录活动,当用户在论坛页面之间切换时,不断更新last_seen
列,现在要检测用户是在线还是离线,您需要从last_seen time
中减去current 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 */
{{1}}
答案 2 :(得分:2)
已经解释了执行此操作的传统方式(每次用户加载某些内容时更新“last_activity”字段)。
我将指出一种完全不同的方式: websockets 。
如您所知http
以请求 - 响应方式工作。连接由客户端创建,并在发送响应后关闭(好吧,并非总是如此,具体取决于keepalive)。所以你的问题(“我怎么知道用户是否还在那里?”)除非你接受这个问题,否则无法解决:“如果用户没有请求更多内容,请考虑他已不在线了“。
好吧,websockets在这里有一个优势,因为在客户端或服务器决定断开连接之前,连接不会关闭。因此,您可以在用户进入论坛时打开连接,并将其保留在那里,直到客户端离开页面或关闭浏览器,从而关闭连接。
坏消息:您必须编写一个侦听这些连接的服务器。例如,使用Node.js.这并不困难,但您需要root访问服务器,然后编写几行代码。
传统方式更简单,它只是一个SQL查询,但了解替代方案很好。
修改强>
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>
我刚刚对此进行了编码,因此它可能包含错误并且不起作用,但它是一个可以开始的地方。
答案 3 :(得分:1)
如果你可以经历一些压力,你可以使用轮询与服务器建立开放连接,并返回鼠标的数组位置,持续30秒,如果位置与之前的30秒相同,那么你会得出结论,用户当前不是活跃的。并且可以创建一个脚本来记录用户......好吧,我只是说......