- <?php
- if($whosonlinestatus == 1 || $whosonlinestatus == 3) { //显示在线情况
- $whosonlinestatus = 1;
- $onlineinfo = explode("\t", $onlinerecord); //$onlineinfo变量,$onlinerecord来自index.php的extract($_DCACHE)处理
- if(empty($_DCOOKIE['onlineusernum'])) {
- $onlinenum = $db->result_first("SELECT COUNT(*) FROM {$tablepre}sessions"); //在线人数
- if($onlinenum > $onlineinfo[0]) { //如果当前数据库中取得的在线人数大于原来在线人数,则更新$onlinerecord
- $_DCACHE['settings']['onlinerecord'] = $onlinerecord = "$onlinenum\t$timestamp";
- $db->query("UPDATE {$tablepre}settings SET value='$onlinerecord' WHERE variable='onlinerecord'"); //同时更新settings表
- require_once DISCUZ_ROOT.'./include/cache.func.php';
- updatesettings(); //更新settings缓存
- $onlineinfo = array($onlinenum, $timestamp); //更新$onlineinfo数组
- }
- dsetcookie('onlineusernum', intval($onlinenum), 300); //将在线人数写入cookie
- } else {
- $onlinenum = intval($_DCOOKIE['onlineusernum']); //如果cookie中在线人数不为空,直接读出
- }
- $onlineinfo[1] = gmdate($dateformat, $onlineinfo[1] + ($timeoffset * 3600)); //更新在线情况的时间戳
- $detailstatus = $showoldetails == 'yes' || (((!isset($_DCOOKIE['onlineindex']) && !$whosonline_contract) || $_DCOOKIE['onlineindex']) && $onlinenum < 500 && !$showoldetails);
- /*
- * 判断在线详情变量,这里比较复杂,仔细看一下,主要是$showoldetails == 'yes'与cookie中的首页显示啊 一些条件
- */
- if($detailstatus) { //以下是处理在线人数列表的
- @include language('actions'); //引用语言文件 /templates/default/actions.lang.php
- $discuz_uid && updatesession(); //更新session
- $membercount = $invisiblecount = 0; //初始化会员数量及隐身的数量
- $whosonline = array(); //初始化数组
- $maxonlinelist = $maxonlinelist ? $maxonlinelist : 500; //最大在线人数,如果未设置,初始化为500
- $query = $db->query("SELECT uid, username, groupid, invisible, action, lastactivity, fid FROM {$tablepre}sessions ".(isset($_DCACHE['onlinelist'][7]) ? '' : 'WHERE uid <> 0')." ORDER BY uid DESC LIMIT ".$maxonlinelist);
- while($online = $db->fetch_array($query)) {
- if($online['uid']) { //会员
- $membercount ++; //会员总数
- if($online['invisible']) { //隐身用户
- $invisiblecount++;
- continue;
- } else {
- $online['icon'] = isset($_DCACHE['onlinelist'][$online['groupid']]) ? $_DCACHE['onlinelist'][$online['groupid']] : $_DCACHE['onlinelist'][0];
- //用户组的图标
- }
- }
- else { //游客,区别是数据表session中uid为0表示未登录的游客
- $online['icon'] = $_DCACHE['onlinelist'][7];
- $online['username'] = $_DCACHE['onlinelist']['guest'];
- }
- $online['fid'] = $online['fid'] ? $forumname[$online['fid']] : 0; //用户正浏览版块
- $online['action'] = $actioncode[$online['action']]; //用户正进行的动作
- $online['lastactivity'] = gmdate($timeformat, $online['lastactivity'] + ($timeoffset * 3600)); //用户上次访问时间
- $whosonline[] = $online; //赋值给$whosonline数组
- }
- unset($actioncode, $online); //清空两个变量
- if($onlinenum > $maxonlinelist) { //如果总在线人数大于最大在线人数(系统默认为500),分别取出已登录用户和隐身用户
- $membercount = $db->result_first("SELECT COUNT(*) FROM {$tablepre}sessions WHERE uid <> '0'");
- $invisiblecount = $db->result_first("SELECT COUNT(*) FROM {$tablepre}sessions WHERE invisible = '1'");
- }
- if($onlinenum < $membercount) { //如果总在线人数小于在线会员数,则更新cookie中的在线用户人数,注意是onlineusernum而不是onlinenum
- $onlinenum = $db->result_first("SELECT COUNT(*) FROM {$tablepre}sessions");
- dsetcookie('onlineusernum', intval($onlinenum), 300);
- }
- $guestcount = $onlinenum - $membercount;
- $db->free_result($query); //释放数据库连接
- /*
- * 这里复习下mysql连接后关闭的问题:
- * mysql_close() 函数关闭非持久的 MySQL 连接。通常不需要使用 mysql_close(),因为已打开的非持久连接会在脚本执行完毕后自动关闭。
- * mysql_close() 不会关闭由 mysql_pconnect() 建立的持久连接
- * mysql_pconnect() 和 mysql_connect() 非常相似,但有两个主要区别:
- * 1 、当连接的时候本函数将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接。
- * 2、当脚本执行完毕后到 SQL 服务器的连接不会被关闭,此连接将保持打开以备以后使用(mysql_close() 不会关闭由 mysql_pconnect() 建立的连接)。
- */
- unset($online); //清空变量$online,可能这个变量很敏感,所以多清理下
- }
- } else {
- $whosonlinestatus = 0; //如果后台设置不显示在线人数,则不显示在线列表
- }
- }
- else {
- require_once DISCUZ_ROOT.'./include/category.inc.php'; //如果gid为空(指定的版块不存在,请返回)。如果是分 区显示,如url为:index.php?gid=2,则调用这个category.inc.php文件。
- }
- include template('discuz'); //载入首页的模板文件
- ?>
(完)
本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/882320,如需转载请自行联系原作者