一个统计当前在线用户的解决方案

时间:2007-10-13 19:27:00 

在做一个在线交流的网站时,有个问题很令我头疼,就是关于实时统计在线用户的问题,客户要求:统计当前在线人数、游客人数、会员人数、在线用户列表,包括游客、会员和管理员(如果是游客,则自动生成游客的ID,如果是会员,则显示会员姓名)。因为它要求有实时性,则首先我将用global.asa解决的想法pass掉。

问题的关键是如何判断用户已经离开,和当用户离开时如何执行一个文件或一个函数。

经过和网上一些朋友的探讨,终于解决了这个问题。

解决的原理为:编写一个通用页面,所谓的通用页面,就是应用里的每个页面都包含这个页面,例如:header.asp,在这个页面里,用XMLHTTP写一段代码,这段代码的作用是每隔10秒或20秒就向服务器发送一个请求,目的是更新当前用户的在线时间并删除在线时间超过一定时间的用户,使数据库中的在线用户记录保持一定的实时性。

主要实现方法为:

新建一数据库,字段名称分别为:id(字符),name(字符),user(数字)tt(日期),admin(权限代码,0-普通用户,1-管理员) 表名:online

header.asp ↓


<% 
... ... 
if session("s_in")<>1 and session("s_name")="" then ’如果用户是第一次登陆 
rs.open "select * from online",conn,3,3 
rs.addnew 
rs("id")=session.sessionID 
rs("name")="游客" & session.sessionID 
rs("user")=0 ’0表示用户未登陆,是游客身份 
rs("tt")=now 
rs.update 
rs.close 
session("s_in")=1 ’设置用户的资料已经存入数据库,表示已经在线 
end if 
if session("s_name")<>"" then ’如果用户已经通过登录框登录 
rs.open "select * from online where id=’" & session.sessionID & "’",conn,3,3 
rs("name")=session("s_name") 
rs("admin")=session("s_admin") ’将用户的姓名更新为会员名称 
rs("user")=1 ’表示用户已经登陆,是会员身份 
rs("tt")=now ’将当前系统时间设置为用户的登陆时间 
rs.update 
rs.close 
end if 
... ... 
%> 
... ... 
<head> 
... ... 
<script language=javascript> 
function Test() 

var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP"); 
xmlhttp.open("POST","onceonline.asp",false); // 向onceonline.asp发送更新请求 
xmlhttp.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded"); 
xmlhttp.send(); 

setInterval("Test();",10); // 10秒钟发送一次更新请求 
</script> 
... ... 
</head> 
... ... 
onceonline.asp 
<% 
rs.open "select tt from online where id=’" & session.sessionID & "’",conn,3,3 
rs("tt")=now() ’更新当前在线用户的在线时间 
rs.update 
rs.close 
rs.open "delete from online where datediff(’s’,tt,now())>60",conn,3,1 ’删除超时用户 
%> 


这样,基本保证了数据库中用户列表的实时性,误差取决于更新时间和删除时间的差值大小和服务器的处理速度,建议不要将删除超时用户的时间间隔取的过于小,那样有可能会导致在线用户0人的失误。

本方案在WIN2000+SQL Server2000上调试通过,由于本方案对系统要求比较大,期待其他朋友拿出更好的方案,一起解决这个问题!

相关文章推荐:

asp实现通过session来统计在线人数的方法

使用IP地址来统计在线人数方法

标签:统计,在线,在线人数,session
0
投稿

猜你喜欢

  • ASP编程入门进阶(十三):AdRotator & Content Rotator

    2008-09-24 17:47:00
  • asp获取数据库中表名和字段名的代码

    2011-04-18 11:02:00
  • 如何使用ADO.NET连接数据库?

    2010-06-03 10:52:00
  • CSS资料中常见英语词语翻译整理

    2008-08-29 12:50:00
  • 验证sql保留字工具

    2008-05-15 12:34:00
  • 《设计网事》前言

    2009-07-15 17:19:00
  • js调用flash代码

    2010-01-23 12:35:00
  • 2010怎么就宅了——我们是设计星球的阿凡达

    2010-03-09 13:26:00
  • IE9四大渲染引擎模式

    2010-04-20 16:57:00
  • asp如何定义参数?

    2010-05-16 15:20:00
  • css清除浮动的方法总结与选择

    2008-06-06 12:58:00
  • 编程经验点滴 动态SQL的拼接技巧

    2012-11-30 20:03:58
  • PHP程序员最常犯的11个MySQL错误

    2012-01-05 19:13:02
  • Z-Blog垃圾留言判定新方法

    2009-07-06 13:04:00
  • 谈谈CSS样式表的命名规范

    2007-10-08 12:41:00
  • IE6绝对定位的bug及其解决办法

    2011-03-30 12:31:00
  • SQL语句分组获取记录的第一条数据的方法

    2012-08-21 10:58:39
  • YUI学习笔记(2)

    2009-01-21 16:11:00
  • sqlserver 数据库学习笔记

    2011-12-01 08:15:06
  • asp如何用JMail同时给多人发信?

    2010-06-12 12:52:00
  • asp之家 网络编程 m.aspxhome.com