Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

在线人数代码分析,你懂得!

[复制链接]
elevensky 发表于 2011-6-30 14:31:56 | 显示全部楼层 |阅读模式
本帖最后由 elevensky 于 2011-6-30 14:45 编辑

常有碰到有同学问在线人数的问题,官方默认的是显示最大在线500人(建议不要改动太大的值,影响页面加载的效率)。这里我就和大家一起看看,在线人数是如何设置和现实的。
首先我们找到论坛首页的处理程序页面,source/module/forum/forum_index.php找到如下代码:
  1. $onlineinfo = explode("\t", $_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\t".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;
复制代码
以上代码的意思是,如果在线人数>最大显示在线人数,则重新统计在线会员人数。
一旦在线人数<在线会员数,则重新统计所有在线会员数(包括隐身)并写入缓存。
最后由在线总人数和在线会员数得出在线游客。



第四类伤痕 发表于 2011-6-30 21:30:42 | 显示全部楼层
新站长只能学习了。
回复

使用道具 举报

huaifeng 发表于 2011-7-1 14:09:50 | 显示全部楼层
学习了
回复

使用道具 举报

afasdf 发表于 2011-7-3 15:22:42 | 显示全部楼层
学习了

专业提供商城模板:http://shop.youbbx.com
回复

使用道具 举报

famoon 发表于 2011-7-5 15:13:30 | 显示全部楼层
xue学学习不知道何日能混出头
回复

使用道具 举报

pjf山 发表于 2011-7-6 16:55:02 | 显示全部楼层

我想把论坛里几个分区集中到一个页面,比如说是官方的“站长之家”,“discuz!交流讨论”,“discuz!云平台”集中到一个页面,只出现这三个分区,当然还有他下面的板块但是本人菜鸟一个,实在是想不出来,请赐教。。。
回复

使用道具 举报

lianqu_1991 发表于 2011-7-16 13:09:54 | 显示全部楼层
支持一下
回复

使用道具 举报

lianqu_1991 发表于 2011-7-16 13:10:13 | 显示全部楼层
支持一下
回复

使用道具 举报

罗汉绿草 发表于 2011-7-21 11:01:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

子陌 发表于 2011-7-22 18:33:25 | 显示全部楼层
虽然不是很懂,不过,还是支持一下子
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-22 09:40 , Processed in 0.024988 second(s), 3 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表