看到这里很多人会认为直接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\t".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就好了。
效果图:
附件下载utf8的:
附件下载gbk的: