一個統計當前在線用戶的解決方案
在做一個在線交流的網站時,有個問題很令我頭疼,就是關於實時統計在線用戶的問題,客戶要求:統計當前在線人數、遊客人數、會員人數、在線用戶列表,包括遊客、會員和管理員(如果是遊客,則自動生成遊客的ID,如果是會員,則顯示會員姓名)。因為它要求有實時性,則首先我將用global.asa解決的想法pass掉。
問題的關鍵是如何判斷用戶已經離開,和當用戶離開時如何執行一個文件或一個函數。
經過和網上一些朋友的探討,終於解決了這個問題。
解決的原理為:編寫一個通用頁面,所謂的通用頁面,就是應用裡的每個頁面都包含這個頁面,例如:header.asp,在這個頁面裡,用XMLHTTP寫一段代碼,這段代碼的作用是每隔10秒或20秒就向服務器發送一個請求,目的是更新當前用戶的在線時間並刪除在線時間超過一定時間的用戶,使數據庫中的在線用戶記錄保持一定的實時性。
主要實現方法為:
新建一數據庫,字段名稱分別為:id(字符),name(字符),user(數字)tt(日期),admin(權限代碼,0-普通用戶,1-管理員)
表名:online
header.asp↓
============================================================
<%
......
ifsession("s_in")<>1andsession("s_name")=""then'如果用戶是第一次登陸
rs.open"select*fromonline",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'設置用戶的資料已經存入數據庫,表示已經在線
endif
ifsession("s_name")<>""then'如果用戶已經通過登錄框登錄
rs.open"select*fromonlinewhereid='"&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
endif
......
%>
......
<head>
......
<scriptlanguage=javascript>
functionTest()
{
varxmlhttp=newActiveXObject("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>
......