web项目中有什么比较好的方法判断用户在线吗

我们都知道QQ等IM工具是采用长连接方式与服务器端通信的,所以可以实时判断用户是否在线,但在一般的web项目中大多采用短连接,有什么比较好的方式能够在短连接的情况下也能判断用户的在线状态吗?

评论 (3)链接2011-09-20 
  • 0 支持
    可以配置session采取memcache机制存储。这样的速度非常快。而且数据相对准确 – 李水祥 2011-09-22
  • 1 支持
    因为用户不点击退出按钮而直接关闭浏览器是不会清除session的,而session的默认过期时间是1440秒(一般来说这个值也不宜设置得过短,否则用户会遭遇频频掉线的体验),所以用session来判断在线的实时性会比较差 – 至尊宝 2011-09-22
  • 2 支持
    些许经验跟你分享一下:
    1.数据库中建一张临时表,比如MySQL中有一种数据引擎MEMORY,用于存储临时数据的,此表可以代替SESSION使用,且安全性相对较好,但是会增加数据库的负载。实时性还是比较不错的。
    2.使用memcache,把SESSION存入memcache中是一个非常不错的选择。memcache速度快,实时性毋庸置疑,但是这种做法会增加服务器的内存使用率,如果用户量非常巨大,那么对服务器内存的投资会大大增加。
    以上两种方法只是本人经验之谈,也许有更好的办法。不过无论什么办法,在服务器性能相同的情况下,在某方面的用户体验提升了,就会有另一方面的用户体验下降。
    – 罗盛淼 2012-06-18

首先短连接无法做到精确判断,一般采用定时检查,比如5分钟。
简单做法1:
登录后把SESSION数据直接放到表里,退出的时候删掉,查看状态时用表联查。但无法判断直接杀浏览器进程的行为。

简单做法2:
服务端:用内存表或CACHE保存用户ID/最后一次操作时间/当前所在页面标识/有效期等,过期自动会自动清掉。
浏览器端:用Javascript 异步定时请求服务端接口,以便服务器端延长记录的有效期。定时计数信息可以放COOKIE里,比如2分钟请求一次服务端,以减少请求量。

对于大用户量系统,由于以上操作会大大增加系统请求量,所以该功能最好独立部署。在页面上显示的时候也采用异步加载的方式。服务端信息存储可以集群和负载均衡。

这是一个典型的小功能,花大代价问题。做过大型的WEB聊天系统应该会有更好的解决办法,求教更高级的做法。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2011-09-20

之前做SLG时没做过这种需求,不过要做的话,我觉得应该是用memcache、redis这类东西做吧:
1、每次用户操作时,都设置在线标识,5分钟(300秒)过期:

  
$memcache->set("online_{$uid}", true, 0, 300);

2、检查某用户是否在线:

  
$isOnline = (bool)$memcache->get("online_{$uid}");

这样做的准确度不是非常高,但应该能满足一般需求。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2011-09-21

其实我的做法是利用redis进行对用户最后操作时间的记录
然后通过设定的周期去更新用户在线表
这样周期越短误差越小,
但是数据库的压力就会越大
然后如果要判断用户是否在线就根据用户最后操作时间和当前时间的间隔来判断

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-14

用HTTP长连接即可,只是如果要支持大用户量的话,Server端要相关复杂。
在IE、Morzilla Firefox 下端的进度栏都会显示加载没有完成,而且 IE 上方的图标会不停的转动,表示加载正在进行。Google 的天才们使用一个称为“htmlfile”的 ActiveX 解决了在 IE 中的加载显示问题,并将这种方法用到了 gmail+gtalk 产品中

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2011-09-28

使用flash写的C/S结构的组件可以不,flash写成1X1像素的点.

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2011-09-21
  • 0 支持
    那你还是走长连接了 – 至尊宝 2011-09-21
德问是一个专业的编程问答社区,请 登录注册 后再提交答案