|
在做一個(gè)在線交流的網(wǎng)站時(shí),有個(gè)問題很令我頭疼,就是關(guān)于實(shí)時(shí)統(tǒng)計(jì)在線用戶的問題,客戶要求:統(tǒng)計(jì)當(dāng)前在線人數(shù)、游客人數(shù)、會(huì)員人數(shù)、在線用戶列表,包括游客、會(huì)員和管理員(如果是游客,則自動(dòng)生成游客的ID,如果是會(huì)員,則顯示會(huì)員姓名)。因?yàn)樗笥袑?shí)時(shí)性,則首先我將用global.asa解決的想法pass掉。
問題的關(guān)鍵是如何判斷用戶已經(jīng)離開,和當(dāng)用戶離開時(shí)如何執(zhí)行一個(gè)文件或一個(gè)函數(shù)。
經(jīng)過和網(wǎng)上一些朋友的探討,終于解決了這個(gè)問題。
解決的原理為:編寫一個(gè)通用頁(yè)面,所謂的通用頁(yè)面,就是應(yīng)用里的每個(gè)頁(yè)面都包含這個(gè)頁(yè)面,例如:header.asp,在這個(gè)頁(yè)面里,用XMLHTTP寫一段代碼,這段代碼的作用是每隔10秒或20秒就向服務(wù)器發(fā)送一個(gè)請(qǐng)求,目的是更新當(dāng)前用戶的在線時(shí)間并刪除在線時(shí)間超過一定時(shí)間的用戶,使數(shù)據(jù)庫(kù)中的在線用戶記錄保持一定的實(shí)時(shí)性。
主要實(shí)現(xiàn)方法為:
新建一數(shù)據(jù)庫(kù),字段名稱分別為:id(字符),name(字符),user(數(shù)字)tt(日期),admin(權(quán)限代碼,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 '設(shè)置用戶的資料已經(jīng)存入數(shù)據(jù)庫(kù),表示已經(jīng)在線 end if
if session("s_name")<>"" then '如果用戶已經(jīng)通過登錄框登錄 rs.open "select * from online where id='" & session.sessionID & "'",conn,3,3 rs("name")=session("s_name") rs("admin")=session("s_admin") '將用戶的姓名更新為會(huì)員名稱 rs("user")=1 '表示用戶已經(jīng)登陸,是會(huì)員身份 rs("tt")=now '將當(dāng)前系統(tǒng)時(shí)間設(shè)置為用戶的登陸時(shí)間 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發(fā)送更新請(qǐng)求 xmlhttp.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded"); xmlhttp.send(); } setInterval("Test();",10); // 10秒鐘發(fā)送一次更新請(qǐng)求 </script>
... ...
</head>
... ...
==========================================================
onceonline.asp
<% rs.open "select tt from online where id='" & session.sessionID & "'",conn,3,3 rs("tt")=now() '更新當(dāng)前在線用戶的在線時(shí)間 rs.update rs.close
rs.open "delete from online where datediff('s',tt,now())>60",conn,3,1 '刪除超時(shí)用戶 %>
|