最近做一个论坛,其实DZ并不是多难,目录结构以及命名都比较规范。就是后台稍微有点复杂,遇到问题去www.discuz.net搜索几乎都能找打答案。

不过,这个问题比较麻烦,就是会员“在线时间”更新的问题。有时候不更新,一直为零,下面找出更新时间的函数吧

在根目录/source/function/function_core.php这个文件中,函数就是updatesession()这个函数,看这个函数的最后一部分,这是关键的地方,更新用户在线时间相关的两张表;pre_common_member_count和pre_common_member_status

1 if($_G['uid'] && TIMESTAMP - $ulastactivity > 21600) {
2 if($oltimespan && TIMESTAMP - $ulastactivity > 43200) {
3 $total = DB::result_first("SELECT total FROM ".DB::table('common_onlinetime')." WHERE uid='$_G[uid]'");
4 DB::update('common_member_count', array('oltime' => round(intval($total) / 60)), "uid='$_G[uid]'", 1);
5 dsetcookie('ulastactivity', authcode(TIMESTAMP, 'ENCODE'), 31536000);
6 }
DB::update('common_member_status', array('lastip' => $_G['clientip'], 'lastactivity' => TIMESTAMP, 'lastvisit' => TIMESTAMP), "uid='$_G[uid]'", 1)
8 }

可以看到,当用户上线的时候,当前服务器时间减去上次活动时间大于21600秒也就是6个小时的时候,把这个定义为状态一,那么,在状态一下将更新pre_common_member_status表中当前用户的活动时间和访问时间等等;

当满足状态一条件的时候,如果当前服务器时间减去上次活动时间大于43200秒也就是12个小时的时候更新表pre_common_member_count,就是在这里更新在线时间的。

想要更新的速度更快更精确,那么就把这两个时间调小,比如一个小时或者两个小时更新一次,这个根据需要了。

PS:更新时间调小也就意味更新频率加大,增加服务器的负担,可以在前面加上时间段的判断,或者在线用户多少的判断,根据综合因素调整更新时间间隔。