簡體   English   中英

如何在網站上跟蹤用戶使用情況?

[英]How to track user usage on site?

我正在使用PHP / MYSQL。 每次用戶登錄時,我們都會插入他們登錄的時間和他們登錄的日期。雖然我們很容易告訴特定日期登錄的用戶數量,但我不確定如何計算他們在網站上花費的時間。

例如,就像用戶登錄並將記錄插入到login_tracking表中一樣,當用戶在他們注銷時點擊“注銷”時,我們也會更新該記錄。 這樣我們減去登錄和退出的時間,並且我們得到每個人花費的時間,但是如果大多數人沒有點擊“注銷”而是清除cookie /緩存或者只是關閉窗口/標簽網站是打開的,會發生什么在?

有一個更好的方法嗎? 我正在使用Google Analytics(分析),它可以讓我每天都會看到用戶和訪問,但我想要一些專有的跟蹤使用情況?

任何想法我能做什么?

更新:@Paul問我是否正在使用Sessions。 我是,這就是我使用它的方式:

$ username = $ _SESSION [“username”];

您可以通過在登錄時設置日期時間來完成此操作。

因此,當用戶登錄時,您更新了DATETIME的mysql字段,類似於......

 $q = $dbc -> prepare("UPDATE accounts SET loggedOn = NOW() WHERE username = ?");
 $q -> execute(array($_SESSION['username']));

現在你要做的就是在你的數據庫表中創建一個名為totalTime ,一個名為active或者你喜歡的任何列。

在每個頁面加載更新active ,這是一個DATETIME列也與NOW()

 $q = $dbc -> prepare("UPDATE accounts SET active = NOW() WHERE username = ?");
 $q -> execute(array($_SESSION['username']));

這可以確保您知道用戶是否仍在線,您可以檢查他們上次活動的時間。 現在說如果你在5分鍾不活動后想要找到你所做的總時間,

 $q = $dbc -> prepare("UPDATE accounts SET totalTime = ADDDATE(totalTime, DATEDIFF(NOW(), loggedOn)) WHERE active < DATE_SUB(NOW(), INTERVAL 5 MINUTE)");
 $q -> execute();

以上操作是如果用戶在5分鍾內處於非活動狀態,則會從當前時間開始記錄已loggedOn時間減去該時間,從而為您留下網站上的總時間並將其添加到DATETIMEtotalTime

只需將最后一個查詢設置為每5分鍾一次的cron設置,您就可以非常准確地衡量人們在您網站上的時間。

我做了一個簡單的網站聊天腳本做了類似的事情。

我所做的是將他們的會話ID和時間戳存儲在一個表中。 他們訪問的每一頁,我都會更新時間戳。 當他們退出時,我會破壞他們的日志。 我還對其他用戶進行了5分鍾“非活動”的更新腳本檢查並將其刪除。 您可以通過設置一個每5或10分鍾運行一次的cron作業來完成同樣的事情,並檢查那些超過5-10分鍾的時間戳並將這些用戶標記為非活動狀態,然后計算在該站點上花費的總時間。

如果您只想在特定時間活動一些用戶,我會查看http://whos.amung.us/ 它是一個簡單的插件,可以計算任何給定時間和在線人員的在線人數。

我建議您使用“上次使用”字段而不是保存注銷日期/時間的字段,以及“首次使用”字段而不是保存登錄日期/時間的字段。

每當用戶請求頁面時,您將檢查“上次使用”值,如果不久之前(例如:少於15分鍾),您將其更新為當前日期/時間,否則,您將擁有在數據庫中創建新記錄(假設用戶現在處於新的“會話”中,但不必創建新的記錄)。 當然,將會話與新創建的記錄相關聯。

這是一個偽代碼:

Page Requested
if new session
    create session 
    create database record (first used=now, last used = now)
    associate the session with the record
else
    query the record associated with the current session
    if long ago
        create a new record (first used=now, last used = now)
        associate the new record with the current session
    else
        update the existing record (last used = now)

它看起來很簡單,但我並沒有嘗試實現它。

調整您的login_tracking表以包括:

  • session_id(varchar 100)
  • 用戶身份
  • 時間(只要有活動,每10分鍾更新一次)
  • 開始(日期時間,首次登錄時)
  • 結束(日期時間,當會話被關閉的瀏覽器或注銷殺死時)

碼:

$date = date('Y-m-d H:i:s');
$time=time();
$time_check=$time-600; // user will be marked online if they have any activity for 10 minutes
$session=session_id();

// check if the user is currently listed as online in the database
$getactiveession = mysql_query("SELECT * FROM login_tracking WHERE session = '$session' AND end IS NULL");
$active_session = mysql_num_rows($getactivesession);

// if they are not listed as online, insert a row for them
if($active_session == "0"){
$make_active = mysql_query("INSERT INTO login_tracking (session, user_id, time, start) VALUES('$session', '$user', '$time', '$date')");
}
else {
// UPDATE user's current time if they are already currently logged in
$update_session = mysql_query("UPDATE login_tracking SET time = '$time', user_id = '$user' WHERE session = '$session'");
}

// get total users online
$gettotalonline = mysql_query("SELECT * FROM login_tracking");
$total_online = mysql_num_rows($gettotalonline);


// if over 10 minutes and no new activity (time column has not been updated), update end session time
$end_session_time = mysql_query("UPDATE login_tracking SET end = '$date' WHERE time<$time_check");

有了它,您可以顯示所有在線用戶的列表以及他們的個人資料,頭像等的鏈接。

我唯一能想到的是當為新登錄用戶插入新行時,你可能不得不做“WHERE end ='0000-00-0000,00:00:00”而不是“WHERE end IS NULL”,而不是確定你是否可以在日期時間做一個IS NULL。

回復您的評論#1

我在我的網站上有一個類似的功能,它位於每個頁面上,無論我的用戶瀏覽哪個頁面,它們都會被視為已登錄。因此,它很容易在任何地方實現。

但是,您可能需要將其中的一部分設置為cronjob,以便每分鍾或10分鍾運行一次,以檢查超過10分鍾的記錄。 我這樣說是因為......如果用戶關閉瀏覽器但沒有注銷,它將不會更新他們在數據庫中的記錄,直到另一個人(登錄或訪客)訪問運行上述代碼的頁面。 如果你有一個cronjob運行它,那么就沒有問題了。 (這也解決了你關於執行結束會話時間的評論,我的網站並不要求你提高這一點,所以我認為你的cronjob是必須的)。 至於將它們重定向到注銷頁面,我不確定在這種情況下它是如何工作的,因為它們的頁面沒有被刷新。 這可能需要是ajax或其他東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM