ASP中统计在线人数的方法花样繁多,我也搞不清楚有几种 ^_^,偶这里介绍三种先,如有错误,欢迎各位批评指正,还有好方法,敬请补充!

首先介绍一种最简单的方法,利用 Application、 session 和 Global.asa ,因为当用ASP制作的网页都存放与WWW服务器的基点目录并且WWW服务器启动之后,每当有对ASP文件的HTTP请求时,服务器都会去读取基点目录下的Global.asa文件。所以可以在 Global.asa 文件中包含如下代码:

上面的代码另存为 global.asa 后,放在根目录下,在你要显示在线人数的地方加上如下代码即可显示在线人数:

当前在线<%=application("online")%>人

这种方法的缺点也是显而易见的:
第一、session 比较消耗系统资源;
第二、当在线人数较多时会频繁的 Lock 和 UnLock Application 变量,导致服务器效率降低;
第三、如果你的网站在服务器中的目录深度会因为通过不同的域名访问而不同的话,这句话有点绕口,举个例子:我的BLOG 可以通过两种方式访问:http://fdream.net/blog/ 和 http://blog.afdream.com ,那么我的BLOG 的目录深度在前者中为二,即网站的第一子目录,而在第二种访问方式中则为根目录。那么当不同的访问者分别以两种方式访问时将看到不同的在线结果,因为两者的 Global.asa 不一样,而且一个网站中只有一个 Global.asa 有效。简而言之,就是这个统计结果是不可靠的。

第二种方法:不用 Global.asa ,还是用 session,但是我们是把它保存到数据库,不用 Application 变量,也就无需 Lock 与 UnLock。
首先建一个数据库:count.mdb,包含一个表:count,表中字段为:

ID 自动编号
sess 文本
posttime 日期/时间

具体实现代码如下,文件名为 online.asp:

<%
sessionID = session.SessionID
timeout = 5
‘ 设置session的过期时间

Conn_String = “DRIVER={Microsoft Access Driver (*.mdb)};DBQ=” & Server.MapPath(“count.mdb”)
‘建立数据库连接项
Set ConnCount =Server.CreateObject(“ADODB.Connection”)
ConnCount.Open Conn_String

‘ dateadd函数的运用,指定n分钟为计量单位,计算now()+(-timeout)是时间,也就是过期时间
aaa = dateadd(“n”, -timeout, now())
connCount.Execute (“delete * from count where postdate < #" & aaa & "#")

‘ 保存 sessionID,如果已经在数据库中就不加入数据库
sql0 = “select sess from count where sess='” & sessionID & “‘”
set rscheck = connCount.Execute (sql0)
if rscheck.eof then
sql = “insert into count (sess,postdate) values(‘” & sessionID & “‘, ‘” & now() & “‘)”
connCount.Execute (sql)
end if
rscheck.close
set rscheck = nothing

‘计算数据库中的值,count(sess)产生新的值,最终用rs(0)读出
sql2 = “select count(sess) from count”
set rs = connCount.Execute (sql2)
count = rs(0)
rs.close
set rs = nothing

‘再对数据进行全盘检查看看是否有超期的数据,有则数据count减一
sql3 = “select * from count”
set rspredel = connCount.Execute (sql3)
do until rspredel.eof
xxx=DateDiff(“n”, rspredel(“postdate”), Now())
if xxx > timeout then
count = count-1
end if
rspredel.movenext
loop
rspredel.close
set rspredel = nothing

connCount.Close
set connCount = nothing

if count = 0 then
count = 1
end if
%>
document.write(‘当前人在线<%=count%>人’);

调用方式如下,在你要显示的地方插入如下代码(注意路径一定要写对哦!):

这种方法的缺点:
当你用不同的域名访问时,尽管是同一个用户,仍然会有不同的 sessionID,当你再换用一个浏览器时,又会有一个新的 sessionID。不过这种情况也太特殊了一点,呵呵,总的来说呢,应该算是比较精确的了,至于读写数据库嘛,嘿嘿……

1 Comment

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.