如何跟踪网站上的用户使用情况


How to track user usage on site?

我使用的是PHP/MYSQL。每次用户登录时,我们都会插入他们的登录时间和登录日期。虽然我们很容易判断某一天有多少用户登录,但我不知道如何计算他们在网站上花费的时间。

例如,就像用户登录并将记录插入login_tracking表一样,当用户点击"注销"时,我们也会更新该记录。这样,我们减去登录和注销的时间,得到每个人花费的时间,但如果大多数人没有点击"注销",而是清除cookie/缓存,或者只是关闭打开网站的窗口/选项卡,会发生什么?

有更好的方法吗?我正在使用谷歌分析,它每天都会给我用户和访问量,但我想要一些专有的东西来跟踪使用情况?

你知道我能做什么吗?

更新:@Paul问我是否在使用Sessions。我是,这就是我使用它的方式:

$username=$_SESSION["username"];

您可以通过在他们登录时设置日期时间来实现这一点。

因此,当用户登录时,您会更新mysql字段DATETIME,类似于。。。

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

现在,您所要做的就是在数据库表中再创建几个列,一个称为totalTime,一个名为active,或者您真正喜欢的任何列。

在每个页面上加载更新active,它是同样具有NOW()、的DATETIME

 $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集,就可以非常准确地测量人们在网站上的时间。

我建议您使用"上次使用"字段来代替保存注销日期/时间的字段,并使用"首次使用"字段代替保存登录日期/时间。

每当用户请求页面时,您都会检查"上次使用"值,如果它是不久前的值(例如:不到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)

它看起来很简单,但我没有尝试实现它。

我做了一个简单的网站聊天脚本,做了类似这样的事情。

我所做的是将他们的会话id和时间戳存储在一个表中。他们访问的每一个页面,我都会更新时间戳。当他们注销时,我会销毁他们的日志。我还检查了其他"非活动"5分钟的用户的更新脚本,并将其删除。你可以通过设置一个cron作业,每5或10分钟运行一次,检查那些超过5-10分钟的时间戳,将这些用户标记为非活动用户,然后计算在网站上花费的总时间来完成同样的事情。

如果你只想知道在特定时间活跃的用户数量,我会研究http://whos.amung.us/.这是一个简单的插件,可以统计在任何给定时间在线的人数以及他们来自哪里。

调整您的login_tracking表以包括:

  • session_id(varchar 100)
  • user_id
  • 时间(只要有活动,每10分钟更新一次)
  • 开始(日期时间,当他们第一次登录时)
  • end(日期时间,当会话被关闭的浏览器或注销)

代码:

$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-00 00:00:00"而不是"WHERE end is NULL",不确定是否可以在日期时间执行is NULL。

回复您的评论#1

我在我的网站上有一个类似的功能,它位于每个页面上,因此无论我的用户浏览哪个页面,他们都会被视为登录。所以它很容易在任何地方实现。

然而,您可能需要将其中的一部分设置为cronjob,每分钟或10分钟运行一次,以检查10分钟内的记录。我这么说是因为。。。如果用户关闭了浏览器但没有注销,则在其他人(已登录或访客)访问运行上述代码的页面之前,它不会更新数据库中的记录。如果您有运行它的cronjob,则不会有问题。(这也解决了你对执行结束会话时间的评论,我的网站不需要你这么高兴地提出这一点,因此我认为你必须使用cronjob)。至于将他们重定向到注销页面,我不确定在这种情况下会如何工作,因为他们的页面没有被刷新。这可能需要ajax之类的东西。