首先我們找到論壇首頁網站模板的處理程序頁面,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 表,讀取線上人數的快取。如果當前人數大於快取最高線上人數,則更新 common_setting 表的最高線上記錄人數,並快取。如果有線上人數記錄則直接讀取線上人數。
如果後臺開啟了現實線上人數,則處理線上現會員資訊。
- $_G['setting']['maxonlinelist'] = $_G['setting']['maxonlinelist'] ? $_G['setting']['maxonlinelist'] : 500;
在此程式對預設顯示的線上人數預設限定為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;
- }
- }
這裡如果在最大線上人數大於當前線上會員,這剩餘的部分透過遊客補全。
- 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;
以上程式碼的意思是,如果線上人數> 最大顯示線上人數,則重新統計線上會員人數。
一旦線上人數< 線上會員數,則重新統計所有線上會員數 (包括隱身) 並寫入快取。
最後由線上總人數和線上會員數得出線上遊客。