发布于 1970-01-01 08:00
  • 3 个回答
    • 我也正在进行这方面的探索,我的实践是这样的,仅供参考:

      1. 对于登陆用户,使用一个长连接以建立客户端与服务器的通讯,首先的原因是这样可以完成服务器推送,同时也能获取用户状态,当长连接断开时,即用户已经下线。由此可以统计出真实的在线用户数量。当前对于长连接我使用pushlet来做,并简单修改了pushlet来完成对于长连接断开的监控。
      2. 对于非登陆用户,可能涉及的我在做的信息收集的服务,即在每个页面加载时,调用一个远端js函数,js函数获取用户的ip以及浏览器等信息,发送ajax请求,保存数据的服务器。原来的目的是为了进行数据挖掘,了解用户的习惯。但是同时也能用来满足你的需求。(这个方法对登陆和非登陆用户都能满足,你需要的是选择一个合适的区间,来认定这个时间区间内用户的访问被视为在线。)

      目前我只有这样两个方法,期待其他好答案。

      2022-11-12 01:44 回答
    • 首先,一般需要在服务器端维持一个用户的在线状态标记用以标识用户是否在线。
      其次,对于会员和游客,简单的说就是登录用户和非登录用户。登录用户很好处理,根据用户的登录和退出动作统计更新用户的在线状态。非登录用户一般采用独立IP来区分。对于一些代理或者共用公网IP的多个用户,添加机器标识用以进一步区分。
      最后,能够区分用户是否在线,能够区分登录用户和非登录用户,统计就是简单问题了。

      2022-11-12 01:44 回答
    • 由于HTTP属于无状态短链接,真实在线是不可知的,因此业内一般的做法都是计算一个大概值,例如“最近10分钟内刷新过页面的人数”即认为是同时在线人数。(当然另外一种是 @cubianyu 所说的长连接或伪长连接,可以做到更精准但在一般web情况下极大的增加了服务器消耗,除非你本身就是要做web聊天那种频繁交互的网站否则还是算了)

      一般的做法为:

      登录用户用户名做key,非登录用户IP做key。任何页面被刷新一次之后就往数据库(或缓存或内存)中写入一条记录:

      username=userA, lastRefreshTime=2012-12-20 12:12:12.000

      另外做一个定时器例如每隔1分钟清理一下表中lastRefreshTime到现在超过10分钟的人数。(定时器可以用Quartz做也可以简单点自己搞个static变量来做)

      最后,在线人数就是这个表的count。

      P.S. “10分钟”这个间隔可以自己来调整,时间越长在线人数看起来就越多,越短就看起来越少,一般的BBS时长会在20-60分钟之间

      2022-11-12 01:44 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有