2008-12-02 57 views
2

我正在對基於成員的站點進行修改,其所有者希望能夠跟蹤數據庫後端中所有用戶在站點(登錄/註銷)上花費的時間。登錄很簡單;有一個入口點(登錄表單),因此登錄可以在數據庫發生時立即引發。如何跟蹤基於Web的登錄和註銷?

然而,註銷有點棘手,因爲除非用戶點擊「註銷」來明確告訴我們他們正在離開解決方案會變得更加麻煩(以及用戶點擊註銷的真正次數是多少?)。一種可能性(就跟蹤站點上的總時間而言)將是在數據庫中註冊每個頁面載入並將其與裝載它的用戶相關聯;問題在於該網站是一個基於會員制的視頻傳送網站(不是你在想什麼!),他們的最後瀏覽量可能會是一個二十或三十分鐘的視頻。我們需要捕捉在最後一頁上花費的時間,而不僅僅是加載時間。

我想到了兩種可能的解決方案,這兩種解決方案都不那麼優雅。第一個是通過javascript來捕獲所有的「卸載」事件,並將一個調用註冊到「logout.php」(假設XMLHttpRequest或任何不會在頁面卸載後立即死掉);問題在於內部鏈接也會註冊爲卸載事件,因此單擊任何鏈接都會將用戶註銷(您可以在「卸載」處理程序中檢查一個標誌,並讓所有內部鏈接設置該標誌 - 不難做到動態,但有點kludgy)。另一種方法是每隔60秒左右設置一次ping數據庫的時間間隔,這讓我們知道用戶仍然在網站上,然後在抽取用戶歷史記錄來計算出該會話的總長度時進行一些數學計算;這似乎也有點ha。。而且,這些解決方案都不適用于禁用JS的用戶。

看來這個問題並不是那麼不尋常,而且還有更好的方法;有沒有解決這個問題的最佳實踐方法?如果沒有,您是否看到了改進這些解決方案的方法?

回答

3

網絡的構建不是爲了準確跟蹤註銷事件。您不能保證在用戶退出時從瀏覽器獲得通知,因此在正常情況下,您希望獲得的最好結果是捕獲會話超時事件,並且該事件可能在用戶放棄頁面20分鐘後纔會觸發。

現在你可以通過在每個頁面上的定時器(也許每分鐘一次或兩次)提供一個ajax請求來提供一個「心跳」,但是這也有一些注意事項:你需要使確保會話最終會超時,並且不保證用戶不會阻止這些請求,可能是通過禁用javascript。

0

我在JavaScript中使用計時器來ping服務器已經取得了很好的成功。在我的情況下,該網站需要JavaScript,所以這不是一個問題。我還使用這種機制來執行檢查,以防止單個帳戶從兩臺不同的計算機登錄,因此有更多令人信服的理由來做這件事。

有一件事要記住卸載是你仍然不能保證卸載事件總是會被解僱。例如,您只需關閉筆記本電腦就可以使用筆記本電腦,因此計時器方法可能會更精確一些。