php下統(tǒng)計(jì)用戶在線時(shí)間的一種嘗試
更新時(shí)間:2010年08月26日 00:50:51 作者:
一直以來(lái),在web開(kāi)發(fā)中,準(zhǔn)確統(tǒng)計(jì)用戶在線時(shí)間都是一個(gè)老大難的問(wèn)題,雖然已經(jīng)有很多人去嘗試各種不同的方案,可是畢竟項(xiàng)目不同,所用到的方法也是千差萬(wàn)別
下面列出幾個(gè)比較常用的方法:
首先介紹一下所涉及的數(shù)據(jù)表結(jié)構(gòu),四個(gè)字段:
uid<int(10)> :用戶id
session_id<varchar(40)> :用戶登錄后系統(tǒng)產(chǎn)生的session_id,PHP可是使用session_id()函數(shù)獲取
login_time<int(10)> :登錄時(shí)間
logout_time<int(10)> :登出時(shí)間
1. 客戶端定時(shí)發(fā)送請(qǐng)求到服務(wù)器端。實(shí)現(xiàn)方法是在用戶登錄后,將uid,session_id,login_time插入一條記錄,然后在客戶端js設(shè)定一個(gè)計(jì)時(shí)器,比如每10分鐘向服務(wù)器端發(fā)送一個(gè)請(qǐng)求,以此來(lái)達(dá)到更新登出時(shí)間的目的,當(dāng)然這個(gè)間隔時(shí)間設(shè)定的越短,數(shù)據(jù)可能會(huì)越準(zhǔn)確,不過(guò)相應(yīng)的系統(tǒng)的負(fù)載也會(huì)越高,這個(gè)可以根據(jù)實(shí)際情況設(shè)定一個(gè)合適的值。這種方法廣泛應(yīng)用于webgame上,因?yàn)閣ebgame的幾乎所有請(qǐng)求都是ajax請(qǐng)求,不用刷新頁(yè)面,一旦刷新頁(yè)面,這個(gè)計(jì)時(shí)器就失去了價(jià)值,這也是這個(gè)方法的局限性。
2. 服務(wù)器設(shè)定一個(gè)定時(shí)輪詢的腳本。這個(gè)方法是在服務(wù)器端寫一個(gè)定時(shí)執(zhí)行的腳本,比如5分鐘執(zhí)行一次,根據(jù)數(shù)據(jù)庫(kù)中的記錄來(lái)判斷每個(gè)會(huì)話的session_id是否還存在于服務(wù)器上,如果存在就更新logout_time,不存在就跳過(guò)。這樣也能比較準(zhǔn)確的統(tǒng)計(jì)在線時(shí)間,不過(guò)缺點(diǎn)是需要有服務(wù)器的控制權(quán),不然無(wú)法設(shè)定定時(shí)腳本,linux系統(tǒng)可以通過(guò)crontab實(shí)現(xiàn),windows系統(tǒng)可以通過(guò)計(jì)劃任務(wù)來(lái)完成。如果你只是買的虛擬主機(jī),那么這個(gè)方法也同樣不適合你。
3. 在用戶每次活動(dòng)時(shí)更新一下登出時(shí)間。這樣在用戶不活動(dòng)或者退出的時(shí)候,登出時(shí)間就自然而然的存在于數(shù)據(jù)庫(kù)里了,這也是本文著重討論的方案。下面給出實(shí)現(xiàn)方法。
首先,在用戶登錄成功后,記錄下其uid,session_id,并將現(xiàn)在時(shí)間作為登陸時(shí)間,現(xiàn)在時(shí)間+600s作為登出時(shí)間,插入數(shù)據(jù)庫(kù)。
$uid = $_SESSION['uid'] = $info['id'];
$session_id = $_SESSION['session_id'] = session_id();
$login_time = time();
$logout_time = time()+600;
$sql = "INSERT INTO member_login (uid,session_id,login_time,logout_time) values($uid,'$session_id',$login_time,$logout_time)";
mysql_query($sql);
然后在用戶每次活動(dòng),也就是每點(diǎn)擊一個(gè)頁(yè)面時(shí),如果session存在也就是處于登錄狀態(tài)時(shí),更新用戶登出時(shí)間
if($_SESSION['uid']){
$uid = $_SESSION['uid'];
$session_id = $_SESSION['session_id'];
$logout_time = time()+600;
$sql = "UPDATE member_login SET logout_time=$logout_time WHERE uid=$uid AND session_id='$session_id'";
mysql_query($sql);
}
這種方法的優(yōu)點(diǎn)是相對(duì)來(lái)說(shuō)實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,能夠適用于大多數(shù)的網(wǎng)站,沒(méi)有額外的服務(wù)器需求,而且也可以比較準(zhǔn)確的統(tǒng)計(jì)用戶的在線時(shí)間。
缺點(diǎn)也很明顯,增加了數(shù)據(jù)庫(kù)的更新操作,增加了系統(tǒng)的負(fù)載,不過(guò)對(duì)于中小型網(wǎng)站來(lái)說(shuō)應(yīng)該不是問(wèn)題。
首先介紹一下所涉及的數(shù)據(jù)表結(jié)構(gòu),四個(gè)字段:
復(fù)制代碼 代碼如下:
uid<int(10)> :用戶id
session_id<varchar(40)> :用戶登錄后系統(tǒng)產(chǎn)生的session_id,PHP可是使用session_id()函數(shù)獲取
login_time<int(10)> :登錄時(shí)間
logout_time<int(10)> :登出時(shí)間
1. 客戶端定時(shí)發(fā)送請(qǐng)求到服務(wù)器端。實(shí)現(xiàn)方法是在用戶登錄后,將uid,session_id,login_time插入一條記錄,然后在客戶端js設(shè)定一個(gè)計(jì)時(shí)器,比如每10分鐘向服務(wù)器端發(fā)送一個(gè)請(qǐng)求,以此來(lái)達(dá)到更新登出時(shí)間的目的,當(dāng)然這個(gè)間隔時(shí)間設(shè)定的越短,數(shù)據(jù)可能會(huì)越準(zhǔn)確,不過(guò)相應(yīng)的系統(tǒng)的負(fù)載也會(huì)越高,這個(gè)可以根據(jù)實(shí)際情況設(shè)定一個(gè)合適的值。這種方法廣泛應(yīng)用于webgame上,因?yàn)閣ebgame的幾乎所有請(qǐng)求都是ajax請(qǐng)求,不用刷新頁(yè)面,一旦刷新頁(yè)面,這個(gè)計(jì)時(shí)器就失去了價(jià)值,這也是這個(gè)方法的局限性。
2. 服務(wù)器設(shè)定一個(gè)定時(shí)輪詢的腳本。這個(gè)方法是在服務(wù)器端寫一個(gè)定時(shí)執(zhí)行的腳本,比如5分鐘執(zhí)行一次,根據(jù)數(shù)據(jù)庫(kù)中的記錄來(lái)判斷每個(gè)會(huì)話的session_id是否還存在于服務(wù)器上,如果存在就更新logout_time,不存在就跳過(guò)。這樣也能比較準(zhǔn)確的統(tǒng)計(jì)在線時(shí)間,不過(guò)缺點(diǎn)是需要有服務(wù)器的控制權(quán),不然無(wú)法設(shè)定定時(shí)腳本,linux系統(tǒng)可以通過(guò)crontab實(shí)現(xiàn),windows系統(tǒng)可以通過(guò)計(jì)劃任務(wù)來(lái)完成。如果你只是買的虛擬主機(jī),那么這個(gè)方法也同樣不適合你。
3. 在用戶每次活動(dòng)時(shí)更新一下登出時(shí)間。這樣在用戶不活動(dòng)或者退出的時(shí)候,登出時(shí)間就自然而然的存在于數(shù)據(jù)庫(kù)里了,這也是本文著重討論的方案。下面給出實(shí)現(xiàn)方法。
首先,在用戶登錄成功后,記錄下其uid,session_id,并將現(xiàn)在時(shí)間作為登陸時(shí)間,現(xiàn)在時(shí)間+600s作為登出時(shí)間,插入數(shù)據(jù)庫(kù)。
復(fù)制代碼 代碼如下:
$uid = $_SESSION['uid'] = $info['id'];
$session_id = $_SESSION['session_id'] = session_id();
$login_time = time();
$logout_time = time()+600;
$sql = "INSERT INTO member_login (uid,session_id,login_time,logout_time) values($uid,'$session_id',$login_time,$logout_time)";
mysql_query($sql);
然后在用戶每次活動(dòng),也就是每點(diǎn)擊一個(gè)頁(yè)面時(shí),如果session存在也就是處于登錄狀態(tài)時(shí),更新用戶登出時(shí)間
復(fù)制代碼 代碼如下:
if($_SESSION['uid']){
$uid = $_SESSION['uid'];
$session_id = $_SESSION['session_id'];
$logout_time = time()+600;
$sql = "UPDATE member_login SET logout_time=$logout_time WHERE uid=$uid AND session_id='$session_id'";
mysql_query($sql);
}
這種方法的優(yōu)點(diǎn)是相對(duì)來(lái)說(shuō)實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,能夠適用于大多數(shù)的網(wǎng)站,沒(méi)有額外的服務(wù)器需求,而且也可以比較準(zhǔn)確的統(tǒng)計(jì)用戶的在線時(shí)間。
缺點(diǎn)也很明顯,增加了數(shù)據(jù)庫(kù)的更新操作,增加了系統(tǒng)的負(fù)載,不過(guò)對(duì)于中小型網(wǎng)站來(lái)說(shuō)應(yīng)該不是問(wèn)題。
您可能感興趣的文章:
- 也談php網(wǎng)站在線人數(shù)統(tǒng)計(jì)
- php下用cookie統(tǒng)計(jì)用戶訪問(wèn)網(wǎng)頁(yè)次數(shù)的代碼
- php實(shí)現(xiàn)用戶在線時(shí)間統(tǒng)計(jì)詳解
- php+memcache實(shí)現(xiàn)的網(wǎng)站在線人數(shù)統(tǒng)計(jì)代碼
- php實(shí)現(xiàn)統(tǒng)計(jì)網(wǎng)站在線人數(shù)的方法
- php使用Session和文件統(tǒng)計(jì)在線人數(shù)
- php精確的統(tǒng)計(jì)在線人數(shù)的方法
- PHP統(tǒng)計(jì)當(dāng)前在線用戶數(shù)實(shí)例講解
相關(guān)文章
PHP 出現(xiàn)亂碼和Sessions驗(yàn)證問(wèn)題的解決方法!
PHP程序語(yǔ)言編碼一定要統(tǒng)一為UTF-8或GB2312如果選擇其他的語(yǔ)言在里面中文會(huì)出現(xiàn)亂碼的。2008-12-12PHP使用GETDATE獲取當(dāng)前日期時(shí)間作為一個(gè)關(guān)聯(lián)數(shù)組的方法
這篇文章主要介紹了PHP使用GETDATE獲取當(dāng)前日期時(shí)間作為一個(gè)關(guān)聯(lián)數(shù)組的方法,實(shí)例分析了php中GETDATE函數(shù)使用技巧,需要的朋友可以參考下2015-03-03ThinkPHP模板標(biāo)簽eq if 中區(qū)分0,null,false的方法
下面小編就為大家?guī)?lái)一篇ThinkPHP模板標(biāo)簽eq if 中區(qū)分0,null,false的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03PHP中獲取內(nèi)網(wǎng)用戶MAC地址(WINDOWS/linux)的實(shí)現(xiàn)代碼
做一個(gè)內(nèi)網(wǎng)根據(jù)MAC地址自動(dòng)登錄的應(yīng)用,在WINDOW 2003可以正常使用,函數(shù)如下2011-08-08PHP 5.3和PHP 5.4出現(xiàn)FastCGI Error解決方法
這篇文章主要介紹了PHP 5.3和PHP 5.4出現(xiàn)FastCGI Error解決方法,需要的朋友可以參考下2015-02-02