在做一個在線交流的網站時,有個問題很令我頭疼,就是關於實時統計在線用戶的問題,客戶要求:統計當前在線人數、遊客人數、會員人數、在線用戶列表,包括遊客、會員和管理員(如果是遊客,則自動產生遊客的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上調試通過,由於本方案對系統需求比較大,期待其他朋友拿出更好的方案,一起解決這個問題!
我的信箱: [email protected]
我叫“積木”,歡迎你和我成為朋友!