2012-01-27 57 views
1

對於一個Web應用程序,我正在寫這將是衡量頻繁間隔(每分鐘左右)有多少訪問者在我的應用程序的特定部分中的關鍵。假設我的應用程序有10個小節使用JavaScript進行切換,並使用#!/page8樣式哈希錨定進行持久化。準確地做這件事的最好方法是什麼?如何衡量我的網頁現在有多少訪問者?

我目前的計劃是將數量保存在數據庫中,每次用戶點擊頁面或離開頁面時都會進行相加和相減。但這對我來說並不是一個很好的解決方案。由於關閉瀏覽器,跟蹤頁面葉的事件可能會被取消,人們可能會通過運行API調用來訪問/離開等方式來破壞數據。獲取可靠信息將是很多工作。

編輯:要指定,我的應用程序將不會有用戶帳戶。此外,我不只是試圖記錄我的網頁有多少訪問者。我試圖準確知道我的頁面現在有多少訪客。這意味着我需要一些可靠的方法來了解訪問者不再在我的頁面上。這就是問題所在。我剛剛得到一個好主意,我可以讓他們的頁面上的JavaScript每10秒鐘通知我的服務器,以便他們仍然在那裏,並且如果他們不訪問,他們的訪問將被超時並被移除。這會起作用嗎?如果我要讓成千上萬的人同時使用我的應用程序,這對我的小型服務器來說不是問題嗎?

有什麼想法?


我用了很多常見的Web開發標籤標註這一點,因爲這是一個非常開放的問題,這些標籤可能包含答案

+0

爲什麼不使用Google Analytics或Piwik之類的東西?還有多種商業產品可以提供實時跟蹤,如點擊。 – mobius 2012-01-27 14:38:32

+0

爲什麼要用50-100行代碼自己寫這個模型時使用谷歌工具?並使其個性化...... – Tudor 2012-01-27 14:55:24

+0

@TudorTudor如果我們正在談論一個高度訪問的網站,我不認爲50-100行代碼就可以做到。或者他們可能會工作一兩天。 – mobius 2012-01-27 15:01:35

回答

1

根據您的服務器容量,您可以對.php文件使用循環請求,以保持自定義會話軌跡的存在。但要小心 - 這會在服務器上造成很大的負擔,所以只有在知道後果的情況下才能這樣做!

使用session_start();您可以在數據庫表中使用ID,ip_addr,session_track_id,timestamp等字段編寫自定義會話標識符。不要使用session_id本身,因爲這可能是一個安全問題。更新您調用的每個.php中的時間戳。

此外創建一個自定義.php只有時間戳更新。通過jQuery AJAX每60秒調用一次(或者任何你需要的時間間隔)。您也可以採取一些安全措施來避免您提及的直接API調用。例如,發出在AJAX調用中返回的下一個請求ID,並且需要成爲下一個請求的參數,如果不是,則不會更新時間戳。

創建一個每90秒運行一次的cron(或者您需要的任何時間間隔 - 但明顯比AJAX調用的時間長)。這個cron會查找表中超過X秒的條目並刪除它們。

要找出活動用戶的數量,只需計算表中的行數。

在此方法中可以使用其他安全選項。

這將解決您的情況 - 當用戶關閉窗口時,沒有AJAX調用會使會話保持活動狀態,並且會在幾秒鐘後(在上面的場景中爲90)從數據庫中刪除。

但是,考慮到當你每隔60秒發出一個請求,並且你有1000個在線用戶時,每小時你的數據庫至少有60 000個請求!強大的最優化是必須在這裏...

然而,這個解決方案在我的項目中工作得很好。

+0

我'使用node.js,所以我認爲負載問題不應該是一個問題。這也是我想到的解決方案,所以我喜歡它。它似乎也是目前唯一的答案,實際上解決了我如何知道用戶何時離開的問題。 +1 – Hubro 2012-01-27 15:45:44

+0

這不是一個請求的問題,這是數據庫查詢的問題。但確定,這是可以管理的。同樣想到緩存問題,你應該追加下一個請求ID,這個ID對每個請求來說都是唯一的,或者附加一個隨機參數給請求,否則你可能會碰到各種瀏覽器的緩存問題......我會試着查找一些代碼爲你的樣品... – Michal 2012-01-27 15:52:27

+0

對不起,找不到代碼了,這是我工作了一段時間。不過,這並不難,我樂觀地認爲你會找到自己的路。 – Michal 2012-01-27 16:02:25

0

一種不同的方法是簡單地記錄每個請求的用戶,日期/時間和頁面。

然後,在指定的時間間隔運行一個查詢,該查詢會彙總顯示頁面和用戶數量的數據。將這些結果存儲在單獨的表格中。

通過這種方式,您可以輕鬆地繪製訪客歷史記錄以及提供最新的「當前」訪問者數量響應。

一旦數據彙總完成,您顯然可以從日誌表中刪除數據。

另一個優點是頁面請求不會爲每個請求鎖定表。而遞增/遞減計數器會。根據流量水平,櫃檯方式會對性能產生負面影響。

通過使用日誌,您可以避免鎖定問題,並且實際上將卷移動到外部進程(如SQL作業)中。

0

我看到周圍的網一些選項,但我個人用這一個:

我存儲在數據庫中的用戶表中的每個時間更新用戶行爲時間戳(點擊一個鏈接或左右)

您需要做的事情就是通過檢查時間戳,讓所有用戶知道他們最後一次操作的時間是X秒。 這樣你就可以得到活躍用戶的姓名和他們的號碼。

此外,您可以說一個人是活躍的時間是完全可配置的。

該方法我用於整個網站。 對於不同的頁面,您可以使用不同的表來存儲活動和頁面標識或其他內容。 使用你的想象力。 :)

0

基本上你需要一臺具有3個字段:

user_activity - USER_ID - last_access_timestamp - last_visited_pa​​ge

每次用戶請求數據last_access_timestamp,並且必須更新last_visited_pa​​ge。 請注意,您需要手動提交#page8部分,因爲它不會到達服務器!

然後,您確實需要定義何時將用戶視爲非活動狀態。假設:15分鐘。

#To get total users: 
SELECT * FROM user_activity WHERE last_access_timestamp > NOW() - 15*60; 

#To get total users for page #page8: 
SELECT * FROM user_activity WHERE last_visited_page LIKE '%page8' AND last_access_timestamp > NOW() - 15*60; 
相關問題