一般Web系统统计用户在线功能很重要的一个概念就是离线超时时间,即你访问一个页面(或某个动作后)没有再次动作而被认为离线的时间,比方离线超时设置为20分钟,那么你访问一个页面A,而在30分钟以后再次访问页面B,那么在你访问页面A20分钟以后到你访问页面B这10分钟时间,你将被认为不在线.
Discuz!NT使用xx_Online表来记录在线用户信息与动作,由于访问者的来来去去,那么xx_Online表的记录清理就是一个需要处理问题,一般有这么两种办法,一是使用后台程序(比方windows服务)定期根据用户最后动作时间对比设置的离线时间来清理xx_Online表,另外一种就是每当有用户访问时就进行一次清理,Discuz!NT使用的是后一种,当然不是每个访问多会触发对xx_Online表的Delete操作,Discuz!NT使用了一定的限制条件,比如在有限页面(不是任意页面)触发清理操作,对清理代码执行做时间限制--每个用户最多5分钟触发一次清理操作(更新操作)等.
用户在线功能,需要记录每一次访的用户的身份跟访问的页面,并用这些数据为网站其他功能做服务,因此这个功能主要部分在BasePage中实现(每个页面中都会用到这些代码),我们知道Discuz!nt论坛的前台页多是继承BasePage的, 在BasePage里需要判断用户是注册用户(已登录),还是游客(未登录),判断的依据是根据用户cookie中保存的信息,cookie中会保存用户的UID,跟Password,密码是md5后的形式,并用DES加密后保存到cookie中的,
1.对于cookie中包括密码信息的用户,如果此用户不在online表中(离线超时),那么basePage中,将根据cookie中的uid和密码跟User表中的信息进行对比,如果符合,则在online中创建一条注册用户登录记录,
2.如果cookie中包括密码信息,但是跟User表中信息对比不符合(用户已经被删除,或修改密码)那么,在online中建立一条游客记录(根据IP).
不管怎么样,每个访问都会在online中建立一条记录(缓存情况除外).
而在线统计数据则是根据online表产生的