快速业务通道

Discuz!NT在线用户自动归零Bug分析及解决办法

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-04-10

使用Discuz!NT一段时间的,最近发现论坛上面的在线用户频繁归零,以前都没有出现过这样的错误,对服务器进行检查后,确定不是服务器的问题,于是就考虑是不是Discuz!NT的Bug

幸好Discuz!NT是开源的,于是从官网Down源代码下来解读当中的奥秘

在源代码中找到了下面一段:

  /**//// <summary>
  /// 复位在线表, 如果系统未重启, 仅是应用程序重新启动, 则不会重新创建
  /// </summary>
  /// <returns></returns>
  public static int ResetOnlineList()
  ...{
   try
   ...{
    // 取得在线表最后一条记录的tickcount字段 (因为本功能不要求特别精确)
                //int tickcount = DatabaseProvider.GetInstance().GetLastTickCount();
    // 如果距离现在系统运行时间小于10分钟
                if (System.Environment.TickCount < 600000)
                ...{
                    return InitOnlineList();
                }
    return -1;
   }
   catch
   ...{
    try
    ...{
     return InitOnlineList();
    }
    catch
    ...{
     return -1;
    }
   }

  }
从上面的代码可以看出如果系统运行时间大于10分钟,就算应用程序重新启动, 也不会归零在线用户表的,但Discuz!NT似乎忽略了一点,就是System.Environment.TickCount的值

引用Msdn中的一段话

该属性的值从系统计时器派生,并以 32 位有符号整数的形式存储。因此,如果系统连续运行,TickCount 将在约 24.9 天内从零递增至 Int32.MaxValue,然后跳至 Int32.MinValue(这是一个负数),再在接下来的 24.9 天内递增至零。

也就是说当过了24.9天之后,System.Environment.TickCount的值就为负数,System.Environment.TickCount < 600000的值就为True,在线用户表就会经常被重建归零

知道原理后有什么解决办法呢?

1、最笨的办法重启服务器,这样的话System.Environment.TickCount的值就会归零,你又能用24.9天了

2、如果懂得编程的话就Down源代码下来,把判断逻辑修改为:

if (System.Environment.TickCount < 600000 && System.Environment.TickCount >= 0)
再重新编译DLL,覆盖上去


 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号