找回密码
 立即注册

QQ登录

只需一步,快速开始

Discuz!x3.2 手动修改最新在线人数

新建的论坛没有多少用户,不怎么活跃;于是有一些站长就想通过修改在线人数的方法来提高一下人气,网上有一些虚拟在线人数的插件,可以自己设置虚拟人数范围,但是当你设置很大时,发现最高记录数据高的离谱,跟自己网站不匹配,想对数据清零,这时却发现没这个功能,于是你去网上搜资料,只能找到一些老版本的sql修改方法,你运行了这些sql语句对新版本不起作用,最高记录依旧;却始终没发现一个适合自己X系列版本的清零方法。
114659eitlwycj4iohh9rh.jpg.thumb.jpg
带着这些疑问,我了解了下X系列版本的最高记录写入和调用方法:
1、首先从界面入手,审查元素找到对应的DIV的ID 和CLASS,
1151435ofhh71q7zxww11f.jpg.thumb.jpg
2、通过DIV找到模板文件是"        emplatedefault orumdiscuz.htm"相关代码196-212行是


  1. [b]
  2. [b][url=home.php?mod=space&do=friend&view=online&type=member]{lang onlinemember}[/url][/b]
  3. - [b]$onlinenum[/b] {lang onlines}
  4. - [b]$membercount[/b] {lang index_members}([b]$invisiblecount[/b] {lang index_invisibles}),
  5. [b]$guestcount[/b] {lang index_guests}
  6. - {lang index_mostonlines} [b]$onlineinfo[0][/b] {lang on} [b]$onlineinfo[1][/b].
  7. [/b]


  8. [b]
  9. [b][url=home.php?mod=space&do=friend&view=online&type=member]{lang onlinemember}[/url][/b]
  10. - {lang total} [b]$onlinenum[/b] {lang onlines}
  11. - {lang index_mostonlines} [b]$onlineinfo[0][/b] {lang on} [b]$onlineinfo[1][/b].
  12. [/b]
复制代码


3、分析模板文件代码,可知变量$onlineinfo[0]是最高记录,$onlineinfo[1]是最高记录的时间,根据变量全局搜到
sourcemodule orum orum_index.php这个文件,发现$onlineinfo就是在这里定义的,摘出157-170行并分析如下:


  1. $onlineinfo = explode("        ", $_G['cache']['onlinerecord']);
  2. //读取缓存中的最高记录和时间并写在数组$onlineinfo 中
  3. if(empty($_G['cookie']['onlineusernum'])) {
  4. //判断在线用户数量的cookie是否为空,如果为空就运行下面的程序
  5. $onlinenum = DB::result_first("SELECT count(*) FROM ".DB::table('common_session'));
  6. //搜出session表此时的在线记录数量
  7. if($onlinenum > $onlineinfo[0]) {
  8. //如果此时在线记录数量高于 最高纪录
  9. $onlinerecord = "$onlinenum        ".TIMESTAMP;
  10. //定义字符串$onlinerecord 为最高纪录加此时的时间
  11. DB::query("UPDATE ".DB::table('common_setting')." SET svalue='$onlinerecord' WHERE skey='onlinerecord'");
  12. //更新数据库表最高纪录的svalue值
  13. save_syscache('onlinerecord', $onlinerecord);
  14. //保存缓存数据到'onlinerecord'中
  15. $onlineinfo = array($onlinenum, TIMESTAMP);
  16. //重新定义数组$onlineinfo
  17. }
  18. dsetcookie('onlineusernum', intval($onlinenum), 300);
  19. //重新设置cookie的'onlineusernum'值
  20. } else {
  21. $onlinenum = intval($_G['cookie']['onlineusernum']);
  22. //如果在线用户数量的cookie存在,就读取cookie值
  23. }
  24. $onlineinfo[1] = dgmdate($onlineinfo[1], 'd');
  25. //格式化最高纪录时的时间格式是“2011-9-28”
复制代码


看到这里很多人会认为直接DB::query("UPDATE ".DB::table('common_setting')." SET svalue='$onlinerecord' WHERE skey='onlinerecord'");的sql语句不就行了吗。其实不然,重点在要修改在线最高记录是要修改缓存$_G['cache']['onlinerecord']的值,如果你不修改这个缓存值并且新的在线人数又不高于缓存中最高记录,数组$onlineinfo根本不会重新被赋值,也就没法完成清零 ,哪怕你把表的'common_setting'的值改为“0    1314XXXXXXX”,最高记录会依然读取缓存最高记录。
难点就在$_G['cache']['onlinerecord'])从何而来,变量追溯cache的值要读pre_common_syscache 这个表,缓存数据data`是 mediumblob 这个数据类型,只能在程序里面修改,不能sql语句的方法修改,所以得用插件或者单独写个程序页面来清零,也就是用到上面13行的代码save_syscache('onlinerecord', $onlinerecord);来更新缓存的数值。
4、分析到这里修改方法就有了,定义一下变量$onlinerecord ,更新一下数据库表'common_setting'再保存一下缓存就好了:
$onlinerecord = "$onlinenum        ".TIMESTAMP;
    DB::query("UPDATE ".DB::table('common_setting')." SET svalue='$onlinerecord' WHERE skey='onlinerecord'");
    save_syscache('onlinerecord', $onlinerecord);

重设需要两个值,一个是是最高记录值,一个是最高纪录的时间,就做了个简单的页面方便大家修改,直接把下面的附件传到Discuz! X2根目录下运行就行了:utf8编码的运行:http://www.xxxxxx.com/onlineutf8.php  ;gbk的运行:http://www.xxxxxx.com/onlinegbk.php就好了。

gbk: onlinegbk.rar (986 Bytes, 下载次数: 0) utf8: onlineutf8.rar (1.02 KB, 下载次数: 0)

本教程由无限星辰工作室CRX349独家整理和提供,转载请注明地址,谢谢。本文地址:https://www.xmspace.net/thread-348-1-1.html
无限星辰工作室  好集导航 Discuz全集下载  星辰站长网  集热爱361  一品文学  手机小游戏合集   海外空间网 星辰api  星辰支付二维码管理平台 阿里云服务器 腾讯云服务器
服务Discuz!建站|DiscuzQ配置|二开|小程序|APP|搬家|挂马清理|防护|Win/Linux环境搭建|优化|运维|
服务理念:专业 诚信 友好QQ842062626 服务项目 Q群315524225

发表于 2015-5-30 23:38:11 | 显示全部楼层 |阅读模式

回复 | 使用道具 举报

该帖共收到 0 条回复!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

美图秀

    • fastadmin 后台界面使用字段数组类型
    • Discuz!x3.5 修改标题高亮颜色
    • Discuz!x3.5 应用中心 下载应用一直下载中
    • 帖子定时显示
    • 论坛辅助审核
拖动客服框
Online Service
点击这里给我发消息
点击这里联系我们
微信扫一扫
在线客服
快速回复 返回顶部 返回列表