實(shí)現(xiàn)統(tǒng)計(jì)在線用戶的幾種方式

先說說一些平常的做法:

一,每次用戶操作更新其在線時(shí)間

這個(gè)方法很直接,在用戶表里加一個(gè)字段update_time,每次用戶進(jìn)行操作攻走,都更新這個(gè)字段為當(dāng)前時(shí)間,一般是在一個(gè)被所有Action繼承的基類里寫這個(gè)操作此再。

然后定義一個(gè)過期時(shí)間陋气,比如10分鐘,表示10分鐘沒進(jìn)行任何操作的用戶默認(rèn)為不在線引润。這樣巩趁,統(tǒng)計(jì)當(dāng)前在線用戶的sql語句大概是這樣selectcount(*)fromthink_userwhereupdate_time>now()-10*60

復(fù)制代碼優(yōu)點(diǎn):實(shí)現(xiàn)簡單,通俗易懂

缺點(diǎn):1淳附,對“在線”的定義模糊议慰,萬一用戶看一篇文章時(shí)間比較長,10分鐘內(nèi)沒進(jìn)行任何操作奴曙,他就被忽略了别凹;2,如果user表數(shù)據(jù)量很大洽糟,那效率將極差

二炉菲,將在線用戶單獨(dú)放入一張表

對于方法一的改進(jìn)。新建一張表think_inline坤溃,字段有user_id拍霜、update_time,每次用戶操作時(shí)薪介,先判斷表里有沒有該用戶的記錄祠饺,沒有則新增,有就更新update_time汁政。

并同時(shí)加上刪除失效數(shù)據(jù)操作deletefromthink_inlinewhereupdate_time

復(fù)制代碼這樣道偷,統(tǒng)計(jì)在線就可以直接count這張表就行了缀旁。而且這表的數(shù)據(jù)量不會很大(至少要比用戶表小的多)

優(yōu)點(diǎn):減少數(shù)據(jù)庫壓力

缺點(diǎn):仍然對“在線”的定義不準(zhǔn)確

三,用JS定時(shí)器

這個(gè)方法是綜合了一和二勺鸦。新建一張表think_inline并巍,也是在基類中定義每次用戶操作時(shí)更新時(shí)間,參考二的做法换途。

不同之處是履澳,在每個(gè)html模板里,加上一個(gè)js定時(shí)器怀跛,setInterval('updateTime', 10*3600);每隔10分鐘發(fā)送一次ajax請求,更新update_time字段柄冲。這樣吻谋,即使用戶在一個(gè)頁面停留時(shí)間過長,也不會被誤認(rèn)為不在線了现横。并且可以通過減少請求的間隔漓拾,來增加精確度,當(dāng)然了戒祠,對服務(wù)器的壓力就更大了骇两。

優(yōu)點(diǎn):對在線的判斷較為準(zhǔn)確

缺點(diǎn):仍然不能既精確又不增加服務(wù)器壓力,必須在兩者之間進(jìn)行取舍姜盈。

四低千,使用TP的SessionDb驅(qū)動進(jìn)行最優(yōu)化設(shè)計(jì)

這也就是網(wǎng)上有人說的session存入數(shù)據(jù)庫的方法,這種方法優(yōu)點(diǎn)很多馏颂。目前示血,LZ就是用的這個(gè)。

具體做法是救拉。难审。。有50個(gè)評論亿絮,我就公布告喊,當(dāng)然了,跟百度的那些復(fù)制粘貼的例子不一樣派昧,會有深入解析哦黔姜!

沒多少人看啊,先寫一些蒂萎。

1地淀,為什么要將session存入數(shù)據(jù)庫?

session是存儲在服務(wù)器的一組臨時(shí)數(shù)據(jù)岖是。一般情況下帮毁,我們在做用戶登錄時(shí)实苞,會將用戶數(shù)據(jù)存入session。這樣烈疚,在任何頁面都可以方便調(diào)用黔牵,而且每個(gè)客戶端會產(chǎn)生唯一的session_id,不會混肴爷肝。并且在關(guān)閉瀏覽器后猾浦,服務(wù)器會有session回收機(jī)制,自動刪除過期session灯抛。

這是session的優(yōu)點(diǎn):唯一性金赦、方便調(diào)用、不會過多占用資源对嚼。但是也有缺點(diǎn):在客戶端是以cookie方式保存的夹抗,禁用cookie就沒用了。

那么纵竖,服務(wù)器是如何存放session的呢漠烧?他是默認(rèn)將session以文件的方式保存在硬盤上的∶移觯可是已脓,對于我們碼農(nóng)來說,操作數(shù)據(jù)庫要比讀文件方便的多通殃,并且可以對session數(shù)據(jù)進(jìn)行各種操作度液。

而統(tǒng)計(jì)在線用戶人數(shù)就是通過統(tǒng)計(jì)有多少條session記錄來實(shí)現(xiàn)的。

2画舌,如何把session存入數(shù)據(jù)庫恨诱?

TP的SessionDb驅(qū)動就實(shí)現(xiàn)了這個(gè)功能。原理就是通過改寫PHP默認(rèn)的session操作來實(shí)現(xiàn)骗炉,核心函數(shù)session_set_save_handler()照宝,有興趣的可以研究一下。該驅(qū)動將session的增句葵、讀厕鹃、取、和刪都放入了數(shù)據(jù)庫乍丈。

使用方法也很簡單:1剂碴,建表,驅(qū)動的注釋里的sql語句運(yùn)行下就好

2轻专,添加配置://Session配置

'SESSION_TYPE'=>'db',//數(shù)據(jù)庫存儲session

'SESSION_TABLE'=>'think_session',//存session的表

'SESSION_EXPIRE'=>600,//session過期時(shí)間

復(fù)制代碼這樣忆矛,只要我們在程序里使用了session()函數(shù),數(shù)據(jù)庫里就會有記錄。

3催训,利用數(shù)據(jù)庫session實(shí)現(xiàn)統(tǒng)計(jì)在線用戶

1洽议,統(tǒng)計(jì)在線總?cè)藬?shù)$map=array('session_expire'=>array('gt',NOW_TIME));

$inline=D('Session')->where($map)->count();

復(fù)制代碼2,統(tǒng)計(jì)游客(未登錄)人數(shù)$map=array('session_expire'=>array('gt',NOW_TIME),'session_data'=>array('eq',''));

$huiyuan=D('Session')->where($map)->count();

復(fù)制代碼3漫拭,統(tǒng)計(jì)會員(已登錄)人數(shù)$map=array('session_expire'=>array('gt',NOW_TIME),'session_data'=>array('neq',''));

$huiyuan=D('Session')->where($map)->count();

復(fù)制代碼4亚兄,判斷一個(gè)用戶是否在線。

在用戶表里新增一個(gè)字段:session_id采驻。

(1)在登錄操作里审胚,保存該用戶的session_id,$session_id=session_id();

D('User')->where(array('id'=>$user_id))->save('session_id'=>$session_id);

復(fù)制代碼(2)檢查session表里是否存在該session_id礼旅,未過期并且有值膳叨,$map=array('session_id'=>$session_id,'session_expire'=>array('gt',NOW_TIME),'session_data'=>array('neq',''));

$res=D('Session')->where($map)->find();

if($res){dump('該用戶在線。')}else{dump('該用戶不在線痘系。')}

復(fù)制代碼

碼字太麻煩啦菲嘴,先寫這么多,后面總結(jié)該方法的幾大優(yōu)點(diǎn)以及注意事項(xiàng)碎浇。

4,總結(jié)

1璃俗,實(shí)現(xiàn)步驟:用戶表新增字段保存session_id奴璃;使用TP的SessionDb驅(qū)動。是不是很簡單城豁?

2苟穆,優(yōu)點(diǎn)

(1)比上面三種方法對數(shù)據(jù)庫和服務(wù)器的壓力都小,操作簡單

(2)能夠區(qū)分在線用戶是會員還是游客(session_data字段是否有值)唱星,discuz就是這樣做的

(3)可以通過刪除某用戶的session記錄雳旅,實(shí)現(xiàn)將其“踢下線”的功能

3,缺點(diǎn)

(1)仍然不能精確統(tǒng)計(jì)间聊,只能說攒盈,XX秒內(nèi)在線多少人

4,注意事項(xiàng)

(1)由于該方法的SessionDb驅(qū)動必須使用session()函數(shù)才能觸發(fā)哎榴,所以必須配置自動開啟session(默認(rèn)就是開啟)型豁。TP在執(zhí)行流程里會使用session()函數(shù),所以你什么都不寫尚蝌,session數(shù)據(jù)也會存入數(shù)據(jù)庫迎变。

(2)因?yàn)閿?shù)據(jù)庫的session數(shù)據(jù)是不會自己刪除的,所以對于過期的數(shù)據(jù)飘言,必須調(diào)用session()方法才會刪衣形。

這也就意味著,如果你的網(wǎng)站一個(gè)人都沒有訪問姿鸿,那么數(shù)據(jù)庫的過期session記錄會一直存在谆吴。

也就是由于這種機(jī)制倒源,對于一些突發(fā)事件(用戶直接X瀏覽器、直接關(guān)機(jī)纪铺、發(fā)生地震……)相速,在其關(guān)閉瀏覽器的一段時(shí)間(session過期時(shí)間)后,其他用戶對網(wǎng)站的訪問鲜锚,會觸發(fā)session回收突诬,刪除過期記錄。所以芜繁,就不怕統(tǒng)計(jì)出來的數(shù)據(jù)不準(zhǔn)確了旺隙。

當(dāng)然了,就算沒人訪問骏令,你也可以在count時(shí)加上session_expire>time()來統(tǒng)計(jì)蔬捷。

但是也有誤差,就是session過期時(shí)間榔袋,5分鐘后過期周拐,就有5分鐘的誤差。時(shí)間設(shè)的越小凰兑,對數(shù)據(jù)庫的操作就越頻繁妥粟;越大,精確度就越低。

(3)這個(gè)session過期時(shí)間就意味著,如果用戶5分鐘內(nèi)不進(jìn)行任何操作缸濒,其就會自動退出登錄。所以播急,為了用戶體驗(yàn)好,請加上cookie自動登錄功能售睹。目前官網(wǎng)就是這么做的桩警。

(4)評論里有人提到,驗(yàn)證碼也會存入session昌妹,所以我們判斷的時(shí)候生真,就不能值統(tǒng)計(jì)有值的記錄了。

需要先獲取有值的數(shù)據(jù)捺宗,再判斷里面有沒有保存用戶信息的參數(shù)名柱蟀。雖然session_data字段是用二進(jìn)制存儲的,但是查詢出來就是一個(gè)字符串蚜厉。

比如长已,我們用的user下標(biāo)來保存的用戶信息,session('user',$data);//用戶登錄信息

//獲取真實(shí)會員數(shù)

//查詢有值的session記錄

$list=D('Session')->where(array('session_data'=>array('NEQ',''),'session_expire'=>array('lt',NOW_TIME)))->select();

//判斷值里是否有會員標(biāo)識

foreach($listas$k=>$value){

if(strpos($value['session_data'],'user')===false){

$count++;

}

dump($count);//真實(shí)會員人數(shù)

}

復(fù)制代碼

(5)由于每種瀏覽器都有各自的session機(jī)制,所以术瓮,如果一個(gè)人在一臺電腦上同時(shí)開了5種瀏覽器康聂,則數(shù)據(jù)庫會保存5條不同的記錄

實(shí)際使用時(shí),仍需要考慮搜索引擎的誤差胞四。在其抓取我們的頁面時(shí)恬汁,也會產(chǎn)生session。

五辜伟,最終結(jié)論

由于HTTP協(xié)議的限制:請求完成后就會斷開與客戶端的連接氓侧。所以實(shí)際上,我們根本無法精確而實(shí)時(shí)地統(tǒng)計(jì)在線人數(shù)

导狡!

盡管有各種各樣的方法來增加統(tǒng)計(jì)的精確度约巷,然而都是治標(biāo)不治本。

唯有放棄HTTP協(xié)議旱捧,使用“長連接”的鏈接方式独郎,才能精確判斷用戶在還是離

轉(zhuǎn)自 http://www.thinkphp.cn/topic/3217.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市枚赡,隨后出現(xiàn)的幾起案子氓癌,更是在濱河造成了極大的恐慌,老刑警劉巖贫橙,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贪婉,死亡現(xiàn)場離奇詭異,居然都是意外死亡料皇,警方通過查閱死者的電腦和手機(jī)谓松,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門星压,熙熙樓的掌柜王于貴愁眉苦臉地迎上來践剂,“玉大人,你說我怎么就攤上這事娜膘⊙犯” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵竣贪,是天一觀的道長军洼。 經(jīng)常有香客問我,道長演怎,這世上最難降的妖魔是什么匕争? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮爷耀,結(jié)果婚禮上甘桑,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好跑杭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布铆帽。 她就那樣靜靜地躺著,像睡著了一般德谅。 火紅的嫁衣襯著肌膚如雪爹橱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天窄做,我揣著相機(jī)與錄音愧驱,去河邊找鬼。 笑死浸策,一個(gè)胖子當(dāng)著我的面吹牛冯键,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庸汗,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惫确,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚯舱?” 一聲冷哼從身側(cè)響起改化,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枉昏,沒想到半個(gè)月后陈肛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兄裂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年句旱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晰奖。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谈撒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匾南,到底是詐尸還是另有隱情啃匿,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布蛆楞,位于F島的核電站溯乒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏豹爹。R本人自食惡果不足惜裆悄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臂聋。 院中可真熱鬧光稼,春花似錦崖技、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腻贰,卻和暖如春吁恍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背播演。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工冀瓦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人写烤。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓翼闽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洲炊。 傳聞我的和親對象是個(gè)殘疾皇子感局,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,967評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)暂衡,斷路器询微,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Php:腳本語言,網(wǎng)站建設(shè)狂巢,服務(wù)器端運(yùn)行 PHP定義:一種服務(wù)器端的HTML腳本/編程語言,是一種簡單的撑毛、面向?qū)ο?..
    廖馬兒閱讀 2,137評論 2 38
  • 1、memcache的概念唧领? Memcache是一個(gè)高性能的分布式的內(nèi)存對象緩存系統(tǒng)藻雌,通過在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨...
    桖辶殤閱讀 2,235評論 2 12
  • 大早上去換數(shù)據(jù)線胯杭,小老板氣壞了,說我這剛開張萨驶,你這樣我這一天都得這樣歉摧,放那下午給你換艇肴! 這迷信可不能算講究啊腔呜,真受...
    縱情嬉戲天地間閱讀 214評論 0 0