最近在论坛上出现了许多站点的用户在线时间,或者在线用户的列表出现错误数据。针对以上现象,我简单介绍下论坛更新在线时间和在线用户的机理。

所有的操作都在模板文件footer.htm中的一个不起眼的一条语句<!--{eval updatesession();}-->
<!--{eval updatesession();}-->调用的是function_core.php中的updatesession函数。

  1. function updatesession($force = false) {
  2. global $_G;
  3. static $updated = false;
  4. if(!$updated) {
  5. if($_G['uid']) {
  6. if($_G['cookie']['ulastactivity']) {
  7. $ulastactivity = authcode($_G['cookie']['ulastactivity'], 'DECODE');
  8. } else {
  9. $ulastactivity = getuserprofile('lastactivity');
  10. dsetcookie('ulastactivity', authcode($ulastactivity, 'ENCODE'), 31536000);
  11. }
  12. }
  13. $discuz = & discuz_core::instance();
  14. $oltimespan = $_G['setting']['oltimespan'];
  15. $lastolupdate = $discuz->session->var['lastolupdate'];

复制代码

$oltimespan = $_G['setting']['oltimespan'];对应的值是后台全局--站点功能--其他--用户在线时间更新时长(分钟)的值。

  1. if($_G['uid'] && $oltimespan && TIMESTAMP - ($lastolupdate ? $lastolupdate : $ulastactivity) > $oltimespan * 60) {
  2. DB::query("UPDATE ".DB::table('common_onlinetime')."
  3. SET total=total+'$oltimespan', thismonth=thismonth+'$oltimespan', lastupdate='" . TIMESTAMP . "'
  4. WHERE uid='{$_G['uid']}'");
  5. if(!DB::affected_rows()) {
  6. DB::insert('common_onlinetime', array(
  7. 'uid' => $_G['uid'],
  8. 'thismonth' => $oltimespan,
  9. 'total' => $oltimespan,
  10. 'lastupdate' => TIMESTAMP,
  11. ));
  12. }
  13. $discuz->session->set('lastolupdate', TIMESTAMP);
  14. }

复制代码

如果是会员登录论坛,判断最近更新时间与当前时间的差大于用户在线时间更新时长时,会更新common_onlinetime表(记录会员在线时间)里对应用户的对应字段的值,若没有对应用户,则添加一条记录。

  1. foreach($discuz->session->var as $k => $v) {
  2. if(isset($_G['member'][$k]) && $k != 'lastactivity') {
  3. $discuz->session->set($k, $_G['member'][$k]);
  4. }
  5. }
  6. foreach($_G['action'] as $k => $v) {
  7. $discuz->session->set($k, $v);
  8. }
  9. $discuz->session->update();
  10. $updated = true;

复制代码

然后程序开始更新session(针对所有用户,包括未登录的游客),将session数据存到common_session表里。

  1. if($_G['uid'] && TIMESTAMP - $ulastactivity > 21600) {
  2. if($oltimespan && TIMESTAMP - $ulastactivity > 43200) {
  3. $total = DB::result_first("SELECT total FROM ".DB::table('common_onlinetime')." WHERE uid='$_G[uid]'");
  4. DB::update('common_member_count', array('oltime' => round(intval($total) / 60)), "uid='$_G[uid]'", 1);
  5. }
  6. dsetcookie('ulastactivity', authcode(TIMESTAMP, 'ENCODE'), 31536000);
  7. DB::update('common_member_status', array('lastip' => $_G['clientip'], 'lastactivity' => TIMESTAMP, 'lastvisit' => TIMESTAMP), "uid='$_G[uid]'", 1);
  8. }
  9. }
  10. return $updated;
  11. }

复制代码

最后根据用户最近的更新的时间,将计算出的用户在线时间,更新到common_member_count表(统计用户记录信息表)里,我们看到的在线时间就是从此表里读取出来的,并且记录当前时间为用户最近活跃的时间。(注意:common_member_count表中的在线时间是每12个小时更新一次)

以上有两个关键点:
在线时间的统计是由该函数执行和保存的,在线会员显示是直接读取的common_session表中的数据

此问题已得到解决.论坛每15分钟统计一次论坛在线情况.如仍有用户出现此问题请在本帖后跟帖描述您的具体情况,我们会在第一时间给予解决.
程序是每15分钟更新一次数据库也就是说.当您登陆论坛时 程序在您登陆之的前一分钟更新过SESSION 缓存,那么您在接下来的13分钟内都会显示离线,直至第二次程序再次运行更新SESSION此时,您的状态会显示在线!
PS: 只开着网页没有进行任何操作是不会更新在线时间的.因为SESSION存在生命周期!

另外,请不再次发帖子说自己的时间不正确,请您理解在线时间更新原理.

转载http://bbs.cnliti.com/thread-75557-1-1.html

最近在论坛上出现了许多站点的用户在线时间,或者在线用户的列表出现错误数据。针对以上现象,我简单介绍下论坛更新在线时间和在线用户的机理。

所有的操作都在模板文件footer.htm中的一个不起眼的一条语句<!--{eval updatesession();}-->
<!--{eval updatesession();}-->调用的是function_core.php中的updatesession函数。

  1. function updatesession($force = false) {
  2. global $_G;
  3. static $updated = false;
  4. if(!$updated) {
  5. if($_G['uid']) {
  6. if($_G['cookie']['ulastactivity']) {
  7. $ulastactivity = authcode($_G['cookie']['ulastactivity'], 'DECODE');
  8. } else {
  9. $ulastactivity = getuserprofile('lastactivity');
  10. dsetcookie('ulastactivity', authcode($ulastactivity, 'ENCODE'), 31536000);
  11. }
  12. }
  13. $discuz = & discuz_core::instance();
  14. $oltimespan = $_G['setting']['oltimespan'];
  15. $lastolupdate = $discuz->session->var['lastolupdate'];

复制代码

$oltimespan = $_G['setting']['oltimespan'];对应的值是后台全局--站点功能--其他--用户在线时间更新时长(分钟)的值。

  1. if($_G['uid'] && $oltimespan && TIMESTAMP - ($lastolupdate ? $lastolupdate : $ulastactivity) > $oltimespan * 60) {
  2. DB::query("UPDATE ".DB::table('common_onlinetime')."
  3. SET total=total+'$oltimespan', thismonth=thismonth+'$oltimespan', lastupdate='" . TIMESTAMP . "'
  4. WHERE uid='{$_G['uid']}'");
  5. if(!DB::affected_rows()) {
  6. DB::insert('common_onlinetime', array(
  7. 'uid' => $_G['uid'],
  8. 'thismonth' => $oltimespan,
  9. 'total' => $oltimespan,
  10. 'lastupdate' => TIMESTAMP,
  11. ));
  12. }
  13. $discuz->session->set('lastolupdate', TIMESTAMP);
  14. }

复制代码

如果是会员登录论坛,判断最近更新时间与当前时间的差大于用户在线时间更新时长时,会更新common_onlinetime表(记录会员在线时间)里对应用户的对应字段的值,若没有对应用户,则添加一条记录。

  1. foreach($discuz->session->var as $k => $v) {
  2. if(isset($_G['member'][$k]) && $k != 'lastactivity') {
  3. $discuz->session->set($k, $_G['member'][$k]);
  4. }
  5. }
  6. foreach($_G['action'] as $k => $v) {
  7. $discuz->session->set($k, $v);
  8. }
  9. $discuz->session->update();
  10. $updated = true;

复制代码

然后程序开始更新session(针对所有用户,包括未登录的游客),将session数据存到common_session表里。

  1. if($_G['uid'] && TIMESTAMP - $ulastactivity > 21600) {
  2. if($oltimespan && TIMESTAMP - $ulastactivity > 43200) {
  3. $total = DB::result_first("SELECT total FROM ".DB::table('common_onlinetime')." WHERE uid='$_G[uid]'");
  4. DB::update('common_member_count', array('oltime' => round(intval($total) / 60)), "uid='$_G[uid]'", 1);
  5. }
  6. dsetcookie('ulastactivity', authcode(TIMESTAMP, 'ENCODE'), 31536000);
  7. DB::update('common_member_status', array('lastip' => $_G['clientip'], 'lastactivity' => TIMESTAMP, 'lastvisit' => TIMESTAMP), "uid='$_G[uid]'", 1);
  8. }
  9. }
  10. return $updated;
  11. }

复制代码

最后根据用户最近的更新的时间,将计算出的用户在线时间,更新到common_member_count表(统计用户记录信息表)里,我们看到的在线时间就是从此表里读取出来的,并且记录当前时间为用户最近活跃的时间。(注意:common_member_count表中的在线时间是每12个小时更新一次)

以上有两个关键点:
在线时间的统计是由该函数执行和保存的,在线会员显示是直接读取的common_session表中的数据

此问题已得到解决.论坛每15分钟统计一次论坛在线情况.如仍有用户出现此问题请在本帖后跟帖描述您的具体情况,我们会在第一时间给予解决.
程序是每15分钟更新一次数据库也就是说.当您登陆论坛时 程序在您登陆之的前一分钟更新过SESSION 缓存,那么您在接下来的13分钟内都会显示离线,直至第二次程序再次运行更新SESSION此时,您的状态会显示在线!
PS: 只开着网页没有进行任何操作是不会更新在线时间的.因为SESSION存在生命周期!


另外,请不再次发帖子说自己的时间不正确,请您理解在线时间更新原理.

dz论坛在线时间更新机理分析(解决在线时间不更新和部分用户刷在线时间的问题)相关推荐

  1. python更新pip失败-解决Python pip 自动更新升级失败的问题

    在使用python pip的时候,经常会发生pip版本过低导致失败的情况,这时候,系统会提示让你使用如下命令对pip进行升级更新: python -m pip install --upgrade pi ...

  2. 教你win10更新失败怎么解决,win10系统更新失败怎么办

    相信不少网友都有遇到过win10更新失败的问题,电脑没办法体验最新版win10系统怎么办?我们可以通过重装win10系统的方法解决,下面小白就教下大家win10更新失败的解决方法.更多win11安装教 ...

  3. dz论坛在线咨询使用不了,解决办法

    主要是因为其中的Uin,Site,Menu,第一个字母为大写了,只要改为小写就解决了问题. 如果不会改,就按照以下步骤修改吧: 修改template\default\common\footer.htm ...

  4. win10 系统更新服务器出错,win10系统更新出错如何解决?win10系统更新出错常见的修复方法...

    微软每隔一段时间会收到更新提醒,更新win10能提高系统性能和稳定性,不过,许多小伙伴遇到win10更新出错的问题,尝试关杀毒软件.重新安装系统.重启更新服务等都没有找到解决办法,有什么有效的解决措施 ...

  5. 蓝牙基带数据传输机理分析

    蓝牙基带数据传输机理分析 ZDNet 网络频道频道 更新时间: 2008-01-05 作者: 来源: cww 本文关键词:蓝牙 无线网络 蓝牙(Bluetooth)是一种新型.开放.低成本.短距离的无 ...

  6. ios 前端时间显示NaN异常解决办法

    ios 前端时间显示NaN异常解决办法 参考文章: (1)ios 前端时间显示NaN异常解决办法 (2)https://www.cnblogs.com/panda-yichen/p/11040196. ...

  7. 修改global.func.php,DZ论坛核心代码分析-核心文件global.func.php篇

    用了两天时间才把global.func.php分析完.还打算3天把common.inc.php文件整完,发现又分出来很多文件.所以这一次帖子改变一下策略.先上global.func.php文件的分析吧 ...

  8. 【更新】时隔半月dz论坛自动回复器(zygx8专属)终于完工

    title: [更新]时隔半月dz论坛自动回复器(zygx8专属)终于完工 tags: 小技巧 小工具 categories: 小工具 date: 2020-10-30 23:40:58 前言 工具: ...

  9. dz论坛viewthread.php,解决修改模板后discuz论坛系统首页空白的问题

    discuz7.0,非官方模板,修改了其中的一个地方,发现打开网站首页显示空白. 解决方法:将论坛目录下forumdata/cache和forumdata/templates下面的文件删除,重新打开网 ...

最新文章

  1. web前端培训之Javascript如何改变数组的长度?
  2. mysql 8+ 忘记root密码 解决方案
  3. 一、typescript介绍和安装
  4. oracle 常用命令大汇总
  5. 车提示检测轮胎气压_无钥匙启动的车启动后,车主带着钥匙离开车,能不能把车开走?...
  6. 实数是不是python数据类型_Python数据类型之数字(Numbers)和运算符
  7. 微软Skype Translator将支持阿拉伯语即时语音翻译
  8. 研究人员用数据统计的方法来做文学研究
  9. 阿里、京东、美团、百度面试总结
  10. kubernetes视频教程笔记 (12)-容器探针
  11. web前端行业调研报告_web前端开发述职报告
  12. SI9000常用共面阻抗模型的解释
  13. 【python--爬虫】彼岸图网高清壁纸爬虫
  14. android系统经纬度,android系统获取经纬度总是0值,求解决
  15. php跳转到qq界面,PHP实现QQ登录的开原理和实现过程
  16. CSS控制背景颜色和背景图像的方法
  17. docker 安装mysql,不区分大小写配置
  18. 计算机上安装的网络协议,怎么安装网络协议
  19. word使用技巧-批量删除图片技巧
  20. QT教程,QT从入门到实战教程完整版

热门文章

  1. 后端存储实战-极客时间
  2. 智能营销crm有哪些?
  3. android仿微博底部键盘,keyboard dialog 仿微博键盘
  4. python简单爬虫(下):实战应用——抓取豆瓣同城、登陆图书馆查询图书归还
  5. 机器学习基础学习-多项式回归
  6. font-style italic 和 oblique的区别
  7. Lumerical FDTD Solutions中圆形监视器和分析组的设计
  8. 【软件测试】全网火爆,实战Web项目前后台的bug定位(超详细)
  9. oracle 起停脚本,Oracle BIEE启停脚本
  10. Window 10无法登陆微软账户解决方案