我正在使用PHP / MYSQL。每次用户登录时,我们都会插入他们登录的时间和他们登录的日期。虽然我们很容易告诉特定日期登录的用户数量,但我不确定如何计算他们在网站上花费的时间。
例如,就像用户登录并将记录插入login_tracking表一样,当用户在注销时点击“注销”时,我们也会更新该记录。这样我们减去登录和退出的时间,并且我们得到每个人花费的时间,但是如果大多数人没有点击“注销”而是清除cookie /缓存或者只是关闭窗口/标签网站是打开的,会发生什么在?
有更好的方法吗?我正在使用Google Analytics(分析),它可以让我每天都会看到用户和访问,但我想要一些专有的跟踪使用情况?
任何想法我能做什么?
更新:@Paul问我是否在使用Sessions。我是,这就是我使用它的方式:
$ username = $ _SESSION [“username”];
答案 0 :(得分:2)
您可以通过在登录时设置日期时间来完成此操作。
因此,当用户登录时,您更新了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
时间从当前时间开始减去该时间,从而为您留下网站上的总时间并将其添加到{{1} } DATETIME
列。
只需将最后一个查询设置为每5分钟一次的cron设置,您就可以非常准确地衡量人们在您网站上的时间。
答案 1 :(得分:1)
我制作了一个简单的网站聊天脚本,做了类似的事情。
我所做的是将会话ID和时间戳存储在表格中。他们访问的每一页,我都会更新时间戳。当他们退出时,我会破坏他们的日志。我还对其他用户进行了5分钟“非活动”的更新脚本检查并将其删除。你可以通过设置一个每5或10分钟运行一次的cron作业来完成同样的事情,并检查那些超过5-10分钟的时间戳并将这些用户标记为非活动状态,然后计算在网站上花费的总时间。
如果您只想在特定时间点活动用户,我会调查http://whos.amung.us/。它是一个简单的插件,可以计算任何给定时间和在线人员的在线人数。
答案 2 :(得分:1)
我建议您使用“上次使用”字段,而不是保存注销日期/时间的字段,以及“首次使用”字段,而不是保存登录日期/时间的字段。
每当用户请求页面时,您将检查“上次使用”值,如果不久之前(例如:少于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)
看起来很容易,但我并没有尝试实现它。
答案 3 :(得分:1)
调整您的login_tracking表以包含:
代码:
$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或其他东西。