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

 找回密码
 立即注册
搜索

X2部分用户“在线时间”不变的问题原因解析~

[复制链接]
cokes1 发表于 2012-1-25 17:58:18 | 显示全部楼层 |阅读模式
本帖最后由 cokes1 于 2012-1-26 13:20 编辑

老生常谈的问题了,一直看到有站长朋友问,由于自己没碰到这个问题,所以一直以为是客户端cookies问题导致的。
最近自己站问这个问题的会员多了起来,并且碰到一个比较认真的会员,接连不断的问在线时间的问题,所以仔细看了看程序,发现会员的在线时间并非没更新,common_onlinetime表内的用户时间在累加,只是common_member_count表内的用户数据没有更新。

看了一下updatesession函数,发现更新数据判断也很简单只判断lastactivity,乍一看updatesession函数没有问题,想来想去是不是其他地方有更新lastactivity从而导致某种情况下永远达不到这个更新时间差的判断呢。最后终于在登陆函数on_login内找到了问题所在 -- 用户登陆的时候会更新lastactivity。

很显然这是一个设计上的逻辑错误,如果某会员的浏览器设置为每次关闭自动删除cookies的话,那他每次重开浏览器后再上论坛都需要登陆,而每次登陆都会更新lastactivity为当前时间,用户在线时间的更新条件“当前时间 - 该用户的最后活动时间(lastactivity) > 43200”将永远不可能成立。

涉及到的文件 source\class\class_member.php
  1. DB::query("UPDATE ".DB::table('common_member_status')." SET lastip='".$_G['clientip']."', lastvisit='".time()."', lastactivity='".TIMESTAMP."' WHERE uid='$_G[uid]'");
复制代码

解决办法是,登陆时不更新lastactivity,将lastactivity的更新完全交给updatesession函数。
文件 source\function\function_core.php  154行 改为
  1. DB::query("UPDATE ".DB::table('common_member_status')." SET lastip='".$_G['clientip']."', lastvisit='".time()."' WHERE uid='$_G[uid]'");
复制代码

ps:qq登陆不调用on_login,也不更新lastactivity,所以qq登陆会员无此问题。

评分

1

查看全部评分

回复

使用道具 举报

 楼主| cokes1 发表于 2012-1-25 18:00:00 | 显示全部楼层
本帖最后由 cokes1 于 2012-1-26 01:22 编辑



ps:比较不解的是更新在线时间部分的设计思路,感觉改一下更好吧!
大于6小时小于12小时不浏览论坛就更新一次最后活动时间,用户大于12小时不浏览论坛才更新common_member_count表。如果用户挂在线时间,一直挂着不断的刷新论坛,那common_member_count表就不更新了。为什么要这样设计呢?为了性能?为了不鼓励用户挂在线时间?
  1. //修改前
  2.                 if($_G['uid'] && TIMESTAMP - $ulastactivity > 21600) {
  3.                         if($oltimespan && TIMESTAMP - $ulastactivity > 43200) {
  4.                                 $total = DB::result_first("SELECT total FROM ".DB::table('common_onlinetime')." WHERE uid='$_G[uid]'");
  5.                                 DB::update('common_member_count', array('oltime' => round(intval($total) / 60)), "uid='$_G[uid]'", 1);
  6.                         }
  7.                         dsetcookie('ulastactivity', authcode(TIMESTAMP, 'ENCODE'), 31536000);
  8.                         DB::update('common_member_status', array('lastip' => $_G['clientip'], 'lastactivity' => TIMESTAMP, 'lastvisit' => TIMESTAMP), "uid='$_G[uid]'", 1);
  9.                 }
复制代码
个人感觉,去掉一层判断,当前时间 - 最后活动时间>一定时间,后直接更新common_member_count表和common_member_status表不更好么?这样就可以避免很多会员问为什么不更新的麻烦了。
  1. //修改后
  2.                 if($_G['uid'] && TIMESTAMP - $ulastactivity > 21600) {
  3.                         if($oltimespan) {
  4.                                 $total = DB::result_first("SELECT total FROM ".DB::table('common_onlinetime')." WHERE uid='$_G[uid]'");
  5.                                 DB::update('common_member_count', array('oltime' => round(intval($total) / 60)), "uid='$_G[uid]'", 1);
  6.                         }
  7.                         dsetcookie('ulastactivity', authcode(TIMESTAMP, 'ENCODE'), 31536000);
  8.                         DB::update('common_member_status', array('lastip' => $_G['clientip'], 'lastactivity' => TIMESTAMP, 'lastvisit' => TIMESTAMP), "uid='$_G[uid]'", 1);
  9.                 }
复制代码
请官方解惑~


回复

使用道具 举报

29184 发表于 2012-1-25 18:35:16 | 显示全部楼层
新宝坻,你真强!路过,顶一下你。
回复

使用道具 举报

jayoo 发表于 2012-1-25 18:36:45 | 显示全部楼层
支持一下。
回复

使用道具 举报

天纵网络 发表于 2012-1-25 20:36:40 | 显示全部楼层
支持一下。
回复

使用道具 举报

 楼主| cokes1 发表于 2012-1-26 02:17:59 | 显示全部楼层

更新了解决办法~

29184 发表于 2012-1-25 18:35
新宝坻,你真强!路过,顶一下你。



某些情况下“在线时间”不更新的解决办法~
https://discuz.dismall.com/thread-2613076-1-1.html
回复

使用道具 举报

m.king 发表于 2012-1-30 18:09:53 | 显示全部楼层
研发正在验证你的解决办法。
回复

使用道具 举报

m.king 发表于 2012-1-31 11:11:16 | 显示全部楼层
已经在修复该问题,感谢您的反馈!
回复

使用道具 举报

 楼主| cokes1 发表于 2012-1-31 12:31:08 | 显示全部楼层
m.king 发表于 2012-1-31 11:11
已经在修复该问题,感谢您的反馈!

感谢重视~
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-26 00:57 , Processed in 0.105334 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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