Discuz線上人數統計原理-個人分析
<b>eluban</b><b>論壇線上人數統計原理</b><b></b>
<b>2013-5-6</b><b></b>
一、基本原理(流程)
<a href="http://blog.51cto.com/attachment/201305/181910770.png" target="_blank"></a>
1、讀取和生成線上人數
使用者每次進入首頁,會讀取COOKIE中的$_DCOOKIE['onlineusernum'](線上人數cookie值,此cookie包括會員和遊客)。
[a]、如果【有】,這個值就去取,然後直接顯示。
[b]、如果【沒有】,系統就會分别統計表cdb_sessions中“會員(已登入)”和“遊客(沒有登入)”的人數。并建立$_DCOOKIE['onlineusernum']。注意:此cookie時間隻有5分鐘。如果過了5分鐘,使用者再次進入首頁,則需要重新到資料庫擷取并重新建立cookie。五分鐘時間剛好,DZ這種做法可以有效的緩解伺服器的壓力。
會員在cdb_sessions表中會記錄使用者的IP、username和uid。
遊客在cdb_sessions表的username和uid為空,僅記錄IP,以此來區分。
[c]、另外論壇線上人數統計還受“線上保持時間”控制,如圖:
<a href="http://blog.51cto.com/attachment/201305/181843797.jpg" target="_blank"></a>
“線上保持時間”是指:使用者過了這個設定的值沒有活動,然後其他任何一使用者任一操作都會使系統自動将表cdb_sessions中此使用者的資料删除。注意:隻是删除此使用者在首頁顯示的線上狀态,不是已退出網站(即此使用者還是登入狀态)。
2、更新使用者狀态
使用者每重新整理一次頁面(包括打開任何一個新頁面),系統都會修改表cdb_sessions中的lastactivity(最後活動時間)字段和action(目前操作代号)等。比如:會員是根據username或uid進行修改。遊客是根據IP進行修改。
3、使用者退出處理
使用者點選“退出”,系統會删除cdb_sessions中此賬号對應的sessions資訊。
注意:直接關閉浏覽器、直接清除浏覽器cookie或長時間沒有操作頁面。cdb_sessions表中這些使用者會根據“線上保持時間”來處理。
如果目前時間 — 最後活動時間lastactivity >線上保持時間,系統自動删除cdb_sessions表中此使用者資料。
如果目前時間 — 最後活動時間lastactivity <=線上保持時間,
cdb_sessions表中如果【有】此使用者資訊就修改此使用者的最後活動時間lastactivity。
cdb_sessions表中如果【沒有】此使用者資訊就添加一條此使用者認證資訊。
二、資料庫
資料庫類有專門的一張表記錄目前線上使用者的登入狀态(表:<b>cdb_sessions</b>)
<a href="http://blog.51cto.com/attachment/201305/181824225.jpg" target="_blank"></a>
各字段釋義如下:
cdb_sessions 會員認證表
sid char SID
ip1 tinyint IP段
ip2 tinyint IP段
ip3 tinyint IP段
ip4 tinyint IP段
uid mediumint 會員ID
username char 會員名
groupid smallint 會員組
styleid smallint 風格ID
invisible tinyint 是否隐身登入
action tinyint 目前動作
lastactivity int 最後活動時間
lastolupdate int 最後更新時間
pageviews smallint 頁面通路量
seccode smallint 記錄驗證碼
fid smallint 論壇ID
tid mediumint 主題ID
bloguid mediumint 正在浏覽的文集
三、代碼
1、 控制處理代碼(根目錄index.php第220行左右)
<?php
if(empty($_DCOOKIE['onlineusernum'])) {
$onlinenum = $db->result_first("SELECT COUNT(*) FROM {$tablepre}sessions");
if($onlinenum > $onlineinfo[0]) {
$_DCACHE['settings']['onlinerecord'] = $onlinerecord = "$onlinenum\t$timestamp";
$db->query("UPDATE {$tablepre}settings SET value='$onlinerecord' WHERE variable='onlinerecord'");
require_once DISCUZ_ROOT.'./include/cache.func.php';
updatesettings();
$onlineinfo = array($onlinenum, $timestamp);
}
dsetcookie('onlineusernum', intval($onlinenum), 300);
} else {
$onlinenum = intval($_DCOOKIE['onlineusernum']);
}
$onlineinfo[1] = gmdate($dateformat, $onlineinfo[1] + ($timeoffset * 3600));
?>
2、 模闆循環顯示代碼(模闆根目錄discuz.htm第290行左右)
<ul class="userlist">
<!--{if $whosonline}-->
<!--{loop $whosonline $key $online}-->
<li title="{lang time}: $online[lastactivity]{LF} {lang action}: $online[action] <!--{if $online['fid']}-->{LF}{lang forum}: $online[fid]<!--{/if}-->">
<img src="images/common/$online[icon]" alt="" />
<!--{if $online['uid']}-->
<a href="space.php?uid=$online[uid]">$online[username]</a>
<!--{else}-->
$online[username]
<!--{/if}-->
</li>
<!--{/loop}-->
<!--{else}-->
<li style="width: auto">{lang online_only_guests}</li>
<!--{/if}-->
</ul>
本文轉自許琴 51CTO部落格,原文連結:http://blog.51cto.com/xuqin/1194265,如需轉載請自行聯系原作者