实现统计在线用户的几种方式,欢迎大家发表观点!

最近在北京网站建设中,考虑做个统计在线用户的功能。以前也做过,用的一些比较简单的方法,但是缺点也很明显:精确统计和服务器、数据库压力之间要做出平衡。

所以想找一个既能精确统计又能不占用太多服务器资源的方法。先说说一些平常的做法:

一,每次用户操作更新其在线时间

这个方法很直接,在用户表里加一个字段update_time,每次用户进行操作,都更新这个字段为当前时间,一般是在一个被所有Action继承的基类里写这个操作。

然后定义一个过期时间,比如10分钟,表示10分钟没进行任何操作的用户默认为不在线。这样,统计当前在线用户的sql语句大概是这样

select count(*) from think_user where update_time>now()-10*60

优点:实现简单,通俗易懂

缺点:1,对“在线”的定义模糊,万一用户看一篇文章时间比较长,10分钟内没进行任何操作,他就被忽略了;2,如果user表数据量很大,那效率将极差

二,将在线用户单独放入一张表

对于方法一的改进。新建一张表think_inline,字段有user_id、update_time,每次用户操作时,先判断表里有没有该用户的记录,没有则新增,有就更新update_time。

并同时加上删除失效数据操作

delete from think_inline where update_time

这样,统计在线就可以直接count这张表就行了。而且这表的数据量不会很大(至少要比用户表小的多)

优点:减少数据库压力

缺点:仍然对“在线”的定义不准确

三,用JS定时器

这个方法是综合了一和二。新建一张表think_inline,也是在基类中定义每次用户操作时更新时间,参考二的做法。

不同之处是,在每个html模板里,加上一个js定时器,setInterval('updateTime', 10*3600);每隔10分钟发送一次ajax请求,更新update_time字段。这样,即使用户在一个页面停留时间过长,也不会被误认为不在线了。并且可以通过减少请求的间隔,来增加精确度,当然了,对服务器的压力就更大了。

优点:对在线的判断较为准确

缺点:仍然不能既精确又不增加服务器压力,必须在两者之间进行取舍。

总结:

由于HTTP协议的限制:请求完成后就会断开与客户端的连接。所以实际上,

我们根本无法精确而实时地统计在线人数

尽管有各种各样的方法来增加统计的精确度,然而都是治标不治本。

唯有放弃HTTP协议,使用“长连接”的链接方式,才能精确判断用户在还是离

2017-11-24

0 个评论