常有碰到有同學問在線人數的問題,官方默認的是顯示最大在線500人 (建議不要改動太大的值,影響頁面加載的效率) 。這裏我就和大家一起看看,在線人數是如何設置和現實的。
首先我們找到論壇首頁網站模板的處理程序頁面,source/module/forum/forum_index.php 找到如下代碼:

  1. $onlineinfo = explode(" ", $_G['cache']['onlinerecord']);
  2. if(empty($_G['cookie']['onlineusernum'])) {
  3.                         $onlinenum = DB::result_first("SELECT count(*) FROM ".DB::table('common_session'));
  4.                         if($onlinenum > $onlineinfo[0]) {
  5.                                 $onlinerecord = "$onlinenum ".TIMESTAMP;
  6.                                 DB::query("UPDATE
    ".DB::table('common_setting')." SET svalue='$onlinerecord' WHERE
    skey='onlinerecord'");
  7.                                 save_syscache('onlinerecord', $onlinerecord);
  8.                                 $onlineinfo = array($onlinenum, TIMESTAMP);
  9.                         }
  10.                         dsetcookie('onlineusernum', intval($onlinenum), 300);
  11.                 } else {
  12.                         $onlinenum = intval($_G['cookie']['onlineusernum']);
  13.                 }

這裏$onlineinfo 為在線信息的緩存記錄,如果此值為空,則查詢 common_session 表,讀取在線人數的緩存。如果當前人數大於緩存最高在線人數,則更新 common_setting 表的最高在線記錄人數,並緩存。如果有在線人數記錄則直接讀取在線人數。

如果後台開啓了現實在線人數,則處理在線現會員信息。

  1. $_G['setting']['maxonlinelist'] = $_G['setting']['maxonlinelist'] ? $_G['setting']['maxonlinelist'] : 500;

在此程序對默認顯示的在線人數默認限定為500

  1. $query = DB::query("SELECT uid, username, groupid, invisible, lastactivity, fid FROM ".DB::table('common_session')." WHERE uid>'0' LIMIT ".$_G['setting']['maxonlinelist']);
  2.                         while($online = DB::fetch($query)) {
  3.                                 $membercount ++;
  4.                                 if($online['invisible']) {
  5.                                         $invisiblecount++;
  6.                                         continue;
  7.                                 } else {
  8.                                         $online['icon']
    = !empty($_G['cache']['onlinelist'][$online['groupid']]) ?
    $_G['cache']['onlinelist'][$online['groupid']] :
    $_G['cache']['onlinelist'][0];
  9.                                 }
  10.                                 $online['lastactivity'] = dgmdate($online['lastactivity'], 't');
  11.                                 $whosonline[] = $online;
  12.                         }

這裏通過 common_session 表的查詢,搜索出最近在線的顯示會員,這裏排除了 invisible 的隱身會員。

  1. if(isset($_G['cache']['onlinelist'][7]) && $_G['setting']['maxonlinelist'] > $membercount) {
  2.                                 $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));
  3.                                 while($online = DB::fetch($query)) {
  4.                                         $online['icon'] = $_G['cache']['onlinelist'][7];
  5.                                         $online['username'] = $_G['cache']['onlinelist']['guest'];
  6.                                         $online['lastactivity'] = dgmdate($online['lastactivity'], 't');
  7.                                         $whosonline[] = $online;
  8.                                 }
  9.                         }

這裏如果在最大在線人數大於當前在線會員,這剩餘的部分通過遊客補全。

  1. if($onlinenum > $_G['setting']['maxonlinelist']) {
  2.                                 $membercount = $discuz->session->onlinecount(1);
  3.                                 $invisiblecount =
    DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_session')."
    WHERE invisible = '1'");
  4.                         }
  5.                         if($onlinenum < $membercount) {
  6.                                 $onlinenum = $discuz->session->onlinecount(0);
  7.                                 dsetcookie('onlineusernum', intval($onlinenum), 300);
  8.                         }
  9.                         $guestcount = $onlinenum - $membercount;

以上代碼的意思是,如果在線人數> 最大顯示在線人數,則重新統計在線會員人數。

一旦在線人數< 在線會員數,則重新統計所有在線會員數 (包括隱身) 並寫入緩存。

最後由在線總人數和在線會員數得出在線遊客。