if($oltimespan && $discuz_uid && $lastactivity
&& $timestamp - ($lastolupdate ? $lastolupdate : $lastactivity) > $oltimespan * 60) {
$lastolupdate = $timestamp;
$db->query("UPDATE {$tablepre}onlinetime SET total=total+'$oltimespan', thismonth=thismonth+'$oltimespan', lastupdate='$timestamp' WHERE uid='$discuz_uid' AND lastupdate<='".($timestamp - $oltimespan * 60)."'");
if(!$db->affected_rows()) {
$db->query("INSERT INTO {$tablepre}onlinetime (uid, thismonth, total, lastupdate)
VALUES ('$discuz_uid', '$oltimespan', '$oltimespan', '$timestamp')", 'SILENT');
}
}
设置的$oltimespan是30分钟,也就是没30分钟更新一次用户在线时长。 还有就是,有的用户有"良好的习惯",每次关闭浏览器时都是先在论坛中“退出”再关闭浏览器,下次上论坛在重新登录。
discuz论坛更新时长的机制是:
1,用户登录时更新members表中的lastactivity为当前时间
2,每次有页面访问看$discuz_uid判断是否已经登录,再看$lastolupdate和$lastactivity,如果到当前的时间差大于$oltimespan就更新该用户的在线时长。
3,用户点击“退出”时,直接清空cookie,不判断是否要更新时长 这对那些拥有“良好习惯”的用户就显得很不公平了,如果连续活跃(浏览帖子或发帖等)时间不足$oltimespan,虽然在足够时间后才点击“退出”论坛的,可是在线时间没能更新,再次上论坛时cookie已被清空需要再次登录,又丧失了一次更新时长的机会。