常有碰到有同學(xué)問在線人數(shù)的問題,官方默認(rèn)的是顯示最大在線500人(建議不要改動太大的值,影響頁面加載的效率)。這里我就和大家一起看看,在線人數(shù)是如何設(shè)置和現(xiàn)實的。
首先我們找到論壇首頁網(wǎng)站模板的處理程序頁面,source/module/forum/forum_index.php找到如下代碼:
$onlineinfo = explode(" ", $_G['cache']['onlinerecord']);
if(empty($_G['cookie']['onlineusernum'])) {
$onlinenum = DB::result_first("SELECT count(*) FROM ".DB::table('common_session'));
if($onlinenum > $onlineinfo[0]) {
$onlinerecord = "$onlinenum ".TIMESTAMP;
DB::query("UPDATE ".DB::table('common_setting')." SET svalue='$onlinerecord' WHERE skey='onlinerecord'");
save_syscache('onlinerecord', $onlinerecord);
$onlineinfo = array($onlinenum, TIMESTAMP);
}
dsetcookie('onlineusernum', intval($onlinenum), 300);
} else {
$onlinenum = intval($_G['cookie']['onlineusernum']);
}
這里$onlineinfo為在線信息的緩存記錄,如果此值為空,則查詢common_session表,讀取在線人數(shù)的緩存。如果當(dāng)前人數(shù)大于緩存最高在線人數(shù),則更新common_setting表的最高在線記錄人數(shù),并緩存。如果有在線人數(shù)記錄則直接讀取在線人數(shù)。
如果后臺開啟了現(xiàn)實在線人數(shù),則處理在線現(xiàn)會員信息。
$_G['setting']['maxonlinelist'] = $_G['setting']['maxonlinelist'] ? $_G['setting']['maxonlinelist'] : 500;
在此程序?qū)δJ(rèn)顯示的在線人數(shù)默認(rèn)限定為500;
$query = DB::query("SELECT uid, username, groupid, invisible, lastactivity, fid FROM ".DB::table('common_session')." WHERE uid>'0' LIMIT ".$_G['setting']['maxonlinelist']);
while($online = DB::fetch($query)) {
$membercount ++;
if($online['invisible']) {
$invisiblecount++;
continue;
} else {
$online['icon'] = !empty($_G['cache']['onlinelist'][$online['groupid']]) ? $_G['cache']['onlinelist'][$online['groupid']] : $_G['cache']['onlinelist'][0];
}
$online['lastactivity'] = dgmdate($online['lastactivity'], 't');
$whosonline[] = $online;
}
這里通過common_session表的查詢,搜索出最近在線的顯示會員,這里排除了invisible的隱身會員。
if(isset($_G['cache']['onlinelist'][7]) && $_G['setting']['maxonlinelist'] > $membercount) {
$query = DB::query("SELECT uid, username, groupid, invisible, lastactivity, fid FROM ".DB::table('common_session')." WHERE uid='0' ORDER BY uid DESC LIMIT ".($_G['setting']['maxonlinelist'] – $membercount));
while($online = DB::fetch($query)) {
$online['icon'] = $_G['cache']['onlinelist'][7];
$online['username'] = $_G['cache']['onlinelist']['guest'];
$online['lastactivity'] = dgmdate($online['lastactivity'], 't');
$whosonline[] = $online;
}
}
這里如果在最大在線人數(shù)大于當(dāng)前在線會員,這剩余的部分通過游客補全。
if($onlinenum > $_G['setting']['maxonlinelist']) {
$membercount = $discuz->session->onlinecount(1);
$invisiblecount = DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_session')." WHERE invisible = '1'");
}
if($onlinenum < $membercount) {
$onlinenum = $discuz->session->onlinecount(0);
dsetcookie('onlineusernum', intval($onlinenum), 300);
}
$guestcount = $onlinenum – $membercount;
以上代碼的意思是,如果在線人數(shù)>最大顯示在線人數(shù),則重新統(tǒng)計在線會員人數(shù)。
一旦在線人數(shù)<在線會員數(shù),則重新統(tǒng)計所有在線會員數(shù)(包括隱身)并寫入緩存。
最后由在線總?cè)藬?shù)和在線會員數(shù)得出在線游客。
未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » discuzx在線人數(shù)設(shè)置