asp實現(xiàn)一個統(tǒng)計當前在線用戶的解決方案
更新時間:2007年11月24日 21:57:28 作者:
一個統(tǒng)計當前在線用戶的解決方案
在做一個在線交流的網(wǎng)站時,有個問題很令我頭疼,就是關于實時統(tǒng)計在線用戶的問題,客戶要求:統(tǒng)計當前在線人數(shù)、游客人數(shù)、會員人數(shù)、在線用戶列表,包括游客、會員和管理員(如果是游客,則自動生成游客的ID,如果是會員,則顯示會員姓名)。因為它要求有實時性,則首先我將用global.asa解決的想法pass掉。
問題的關鍵是如何判斷用戶已經(jīng)離開,和當用戶離開時如何執(zhí)行一個文件或一個函數(shù)。
經(jīng)過和網(wǎng)上一些朋友的探討,終于解決了這個問題。
解決的原理為:編寫一個通用頁面,所謂的通用頁面,就是應用里的每個頁面都包含這個頁面,例如:header.asp,在這個頁面里,用XMLHTTP寫一段代碼,這段代碼的作用是每隔10秒或20秒就向服務器發(fā)送一個請求,目的是更新當前用戶的在線時間并刪除在線時間超過一定時間的用戶,使數(shù)據(jù)庫中的在線用戶記錄保持一定的實時性。
主要實現(xiàn)方法為:
新建一數(shù)據(jù)庫,字段名稱分別為:id(字符),name(字符),user(數(shù)字)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 '設置用戶的資料已經(jīng)存入數(shù)據(jù)庫,表示已經(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") '將用戶的姓名更新為會員名稱
rs("user")=1 '表示用戶已經(jīng)登陸,是會員身份
rs("tt")=now '將當前系統(tǒng)時間設置為用戶的登陸時間
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ā)送更新請求
xmlhttp.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");
xmlhttp.send();
}
setInterval("Test();",10); // 10秒鐘發(fā)送一次更新請求
</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 '刪除超時用戶
%>
==============================================================
這樣,基本保證了數(shù)據(jù)庫中用戶列表的實時性,誤差取決于更新時間和刪除時間的差值大小和服務器的處理速度,建議不要將刪除超時用戶的時間間隔取的過于小,那樣有可能會導致在線用戶0人的失誤。
本方案在WIN2000+SQL Server2000上調(diào)試通過,由于本方案對系統(tǒng)要求比較大,期待其他朋友拿出更好的方案,一起解決這個問題!
在做一個在線交流的網(wǎng)站時,有個問題很令我頭疼,就是關于實時統(tǒng)計在線用戶的問題,客戶要求:統(tǒng)計當前在線人數(shù)、游客人數(shù)、會員人數(shù)、在線用戶列表,包括游客、會員和管理員(如果是游客,則自動生成游客的ID,如果是會員,則顯示會員姓名)。因為它要求有實時性,則首先我將用global.asa解決的想法pass掉。
問題的關鍵是如何判斷用戶已經(jīng)離開,和當用戶離開時如何執(zhí)行一個文件或一個函數(shù)。
經(jīng)過和網(wǎng)上一些朋友的探討,終于解決了這個問題。
解決的原理為:編寫一個通用頁面,所謂的通用頁面,就是應用里的每個頁面都包含這個頁面,例如:header.asp,在這個頁面里,用XMLHTTP寫一段代碼,這段代碼的作用是每隔10秒或20秒就向服務器發(fā)送一個請求,目的是更新當前用戶的在線時間并刪除在線時間超過一定時間的用戶,使數(shù)據(jù)庫中的在線用戶記錄保持一定的實時性。
主要實現(xiàn)方法為:
新建一數(shù)據(jù)庫,字段名稱分別為:id(字符),name(字符),user(數(shù)字)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 '設置用戶的資料已經(jīng)存入數(shù)據(jù)庫,表示已經(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") '將用戶的姓名更新為會員名稱
rs("user")=1 '表示用戶已經(jīng)登陸,是會員身份
rs("tt")=now '將當前系統(tǒng)時間設置為用戶的登陸時間
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ā)送更新請求
xmlhttp.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");
xmlhttp.send();
}
setInterval("Test();",10); // 10秒鐘發(fā)送一次更新請求
</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 '刪除超時用戶
%>
==============================================================
這樣,基本保證了數(shù)據(jù)庫中用戶列表的實時性,誤差取決于更新時間和刪除時間的差值大小和服務器的處理速度,建議不要將刪除超時用戶的時間間隔取的過于小,那樣有可能會導致在線用戶0人的失誤。
本方案在WIN2000+SQL Server2000上調(diào)試通過,由于本方案對系統(tǒng)要求比較大,期待其他朋友拿出更好的方案,一起解決這個問題!
您可能感興趣的文章:
- ASP制作在線人數(shù)統(tǒng)計實例
- 統(tǒng)計有多少行JS代碼和ASP代碼
- ASP程序代碼執(zhí)行時間統(tǒng)計類
- asp論壇在線人數(shù)統(tǒng)計研究
- 實現(xiàn)ASP程序執(zhí)行時間統(tǒng)計類的代碼
- ASP訪問數(shù)量統(tǒng)計代碼
- asp.net aspnetpager分頁統(tǒng)計時與實際不符的解決辦法
- asp.net中調(diào)用Office來制作3D統(tǒng)計圖的實例代碼
- ASP.net中網(wǎng)站訪問量統(tǒng)計方法代碼
- php模仿asp Application對象在線人數(shù)統(tǒng)計實現(xiàn)方法
- 四步完成asp網(wǎng)頁設計流量統(tǒng)計
相關文章
ASP+FSO生成的網(wǎng)頁文件默認編碼格式以及轉(zhuǎn)換成UTF-8編碼方法
有一個客人的網(wǎng)站想做一個俄文版,前臺后臺,我統(tǒng)一用utf-8編碼,但通過數(shù)據(jù)庫生成的靜態(tài)俄文信息是亂碼。如果用GB2312顯示,通過數(shù)據(jù)庫生成的靜態(tài)俄文信息正確顯示, 但模板文件俄文是亂碼。2009-11-11
Microsoft VBScript 編譯器錯誤 錯誤 ''800a03e9'' 內(nèi)存不夠的解決方法
今天訪問后臺的時候提示Microsoft VBScript 編譯器錯誤 錯誤 '800a03e9' 內(nèi)存不夠,通過下面的方法簡單修復了下,特分享下,方便需要的朋友2015-07-07
Asp 操作Access數(shù)據(jù)庫時出現(xiàn)死鎖.ldb的解決方法
在一天某個時間段內(nèi)打不開,等待好幾分鐘就會說asp腳本超時,但FTP可以登陸進去,查看數(shù)據(jù)庫目錄時,發(fā)現(xiàn)與數(shù)據(jù)庫(我的數(shù)據(jù)庫是access數(shù)據(jù)庫)同名的記錄鎖定信息文件 (.ldb文件)一直都在那里2009-04-04

