快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

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

在做一个在线交流的网站时,有个问题很令我头疼,就是关于实时统计在线用户的问题,客户要求:统计当前在线人数、游客人数、会员人数、在线用户列表,包括游客、会员和治理员(假如是游客,则自动生成游客的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中优化数据库处理
下一教程: ASP建立WEB页面计数器

您可以阅读与"一个统计当前在线用户的解决方案"相关的教程:
· ASP 0115 ERROR的解决方案
· 最简洁的多重查询的解决方案
· 关于IE缓存的解决方案
· ASP文章系统的解决方案
· 使用ASP记录在线用户的数量
    微笑服务 优质保证 索取样品