一直以來,在web開發中,准確統計用戶在線時間都是一個老大難的問題,雖然已經有很多人去嘗試各種不同的方案,可是畢竟項目不同,所用到的方法也是千差萬別
下面列出幾個比較常用的方法:
首先介紹一下所涉及的數據表結構,四個字段:
1. 客戶端定時發送請求到服務器端。實現方法是在用戶登錄後,將uid,session_id,login_time插入一條記錄,然後在客戶端js設定一個計時器,比如每10分鐘向服務器端發送一個請求,以此來達到更新登出時間的目的,當然這個間隔時間設定的越短,數據可能會越准確,不過相應的系統的負載也會越高,這個可以根據實際情況設定一個合適的值。這種方法廣泛應用於webgame上,因為webgame的幾乎所有請求都是ajax請求,不用刷新頁面,一旦刷新頁面,這個計時器就失去了價值,這也是這個方法的局限性。
2. 服務器設定一個定時輪詢的腳本。這個方法是在服務器端寫一個定時執行的腳本,比如5分鐘執行一次,根據數據庫中的記錄來判斷每個會話的session_id是否還存在於服務器上,如果存在就更新logout_time,不存在就跳過。這樣也能比較准確的統計在線時間,不過缺點是需要有服務器的控制權,不然無法設定定時腳本,Linux系統可以通過crontab實現,Windows系統可以通過計劃任務來完成。如果你只是買的虛擬主機,那麼這個方法也同樣不適合你。
3. 在用戶每次活動時更新一下登出時間。這樣在用戶不活動或者退出的時候,登出時間就自然而然的存在於數據庫裡了,這也是本文著重討論的方案。下面給出實現方法。
首先,在用戶登錄成功後,記錄下其uid,session_id,並將現在時間作為登陸時間,現在時間+600s作為登出時間,插入數據庫。
然後在用戶每次活動,也就是每點擊一個頁面時,如果session存在也就是處於登錄狀態時,更新用戶登出時間
這種方法的優點是相對來說實現起來比較簡單,能夠適用於大多數的網站,沒有額外的服務器需求,而且也可以比較准確的統計用戶的在線時間。
缺點也很明顯,增加了數據庫的更新操作,增加了系統的負載,不過對於中小型網站來說應該不是問題。