已经解释了执行此操作的传统方式(每次用户加载某些内容时更新“last_activity”字段)。
我将指出一种完全不同的方法:websockets。
如您所知http
,以请求-响应方式工作。连接由客户端创建,并在发送响应后关闭(嗯,并非总是如此,取决于keepalive)。因此,除非您接受以下内容,否则您的问题(“我怎么知道用户是否仍然存在? ”)无法解决:“如果用户不请求更多内容,则认为他不再在线”。
好吧,websockets 在这里有一个优势,因为在客户端或服务器决定断开连接之前连接不会关闭。因此,您可以在用户进入论坛时打开连接,并将其保留在那里,直到客户端离开页面或关闭浏览器,从而关闭连接。
坏消息:你必须编写一个监听这些连接的服务器。例如使用 Node.js。不难,但是你需要root访问服务器,然后写几行代码。
传统的方式比较简单,就是一个sql查询,不过了解一下替代方案还是不错的。
编辑
快速示例
- 安装 Node.js:http ://nodejs.org/
- 安装 socket.io(它是一个 node.js 模块):http ://socket.io/
- 像这样编写一个简单的服务器:
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>
我刚刚对其进行了编码,因此它可能包含错误并且无法正常工作,但这是一个开始的地方。