Php 跟踪用户在我的网站上花费的时间
我正在编写一个用户系统,作为我所有用户的可用统计数据,我希望能够向他们提供他们在我的网站上活动的小时数 我最初的想法是: 用户加载一个页面,该用户的记录存储在一个名为accessLog的SQL表中 *用户加载另一个页面,运行sql查询以查看他们上次访问页面的时间* 如果用户在过去两分钟内访问了某个页面,请更新其用户帐户并添加在线时间 *将新记录插入accessLog*Php 跟踪用户在我的网站上花费的时间,php,sql,android-activity,tracking,Php,Sql,Android Activity,Tracking,我正在编写一个用户系统,作为我所有用户的可用统计数据,我希望能够向他们提供他们在我的网站上活动的小时数 我最初的想法是: 用户加载一个页面,该用户的记录存储在一个名为accessLog的SQL表中 *用户加载另一个页面,运行sql查询以查看他们上次访问页面的时间* 如果用户在过去两分钟内访问了某个页面,请更新其用户帐户并添加在线时间 *将新记录插入accessLog* 然而,这将意味着在我的网站的每个页面上增加4个额外的查询,这似乎很慢。我在想,必须有一种更有效的方法来跟踪用户的在线活动,这显然
然而,这将意味着在我的网站的每个页面上增加4个额外的查询,这似乎很慢。我在想,必须有一种更有效的方法来跟踪用户的在线活动,这显然是我愚蠢到看不见的 将其添加到会话管理中。当用户开始他们的会话时,记录他们的开始时间。当用户结束会话时,记录其结束时间。从那里简单的数学将收集到他们在你的网站上每个会话花费的总时间
回答菲利普·哈格伦 是的,但您必须等待会话超时,而该时间并不反映用户在关闭最后一页之前在最后一页上花费的实际时间 这是真的,但话说回来,到目前为止,所有可用的答案都基于相同的基本前提:
如果您确实想知道实际发生了多少活动,您可以发送特定JavaScript事件的AJAX请求。这将把时间跟踪与实际的浏览器事件联系起来。当然,这意味着您的时间跟踪依赖于启用JavaScript。我的理念是:在效率成为问题之前,不要过度关注效率。除非你的网站流量很大,否则你不会注意到这四个查询。不过,这可能更简单:
我的方法很简单:
- 当用户加载页面时,他们的“上次页面加载时间”将在数据库中更新
- cron脚本每分钟运行一次。它查找“最后一页加载时间”在最后一分钟的用户
- 为找到的每个用户增加“在站点上花费的时间”
这并不完全准确,但对于流量适中的站点,它可以实时运行,而不需要CRON 我会使用ajax让客户机随时调用服务器。只需一个命令,就可以告诉服务器用户仍在查看该页面
- 服务器将在数据库中具有lastTimestamp和TotalTimesPent。lastTimestamp只包含发生ajax请求或页面加载的最后时间
- 每次ajax启动时,服务器都会计算
,并将其添加到totalTimeSpentOnSite中now-lastTimestamp
将javascript侦听器添加到
onBlur()
以仅记录该窗口处于活动状态时所花费的实际时间,然后将该时间发送到服务器,而不只是告诉服务器用户仍然处于活动状态。- 首先选择会话被认为中断的持续时间。(例:10分钟)
- 使用数据库中的所有ip记录所有页面加载
- 如果一个ip的两次页面加载之间的时间超过持续时间,请不要将此时间添加到此ip的总时间中
- 如果一个ip的两次页面加载之间的时间小于持续时间,则将此时间添加到此ip的总时间
Piwik就是这样工作的这就是我使用的,它会在用户加载任何页面时检查并更新数据库。 数据是准确的,因为它计算用户是否每分钟加载一个页面,如果是,则将时间差添加到数据库中
$now= time();
$stmt = $db_con->prepare(" SELECT last_seen,time_online FROM user_online_log WHERE user_id=? limit ? ");
$stmt->execute(array( $user_id, 1));
$fetch= $stmt->fetch(PDO::FETCH_ASSOC);
$last_seen=$fetch['last_seen']; //integer value from db, saved from time() function
$last_seen_plus_one_min= $last_seen + 60;
if( $now < $last_seen_plus_one_min ){
$additional_time_online= $now - $last_seen; }
else{ $additional_time_online = 0; }
//update db
$stmt12 = $db_con->prepare(" update user_online_log set last_seen=?, time_online = time_online+? WHERE user_id=? limit 1 ");
$stmt12->execute(array($now, $additional_time_online, $user_id));
$now=time();
$stmt=$db\u con->prepare(“从user\u online\u日志中选择上次看到的时间,其中user\u id=?limit?”);
$stmt->execute(数组($user_id,1));
$fetch=$stmt->fetch(PDO::fetch_ASSOC);
$last_seen=$fetch['last_seen']//db中的整数值,从time()函数保存
$last_seen_plus_one_min=$last_seen+60;
如果($now<$last\u seen\u加上一分钟){
$additional_time_online=$now-$last_seen;}
else{$additional_time_online=0;}
//更新数据库
$stmt12=$db\u con->prepare(“更新上次查看的用户在线日志集=?,时间在线=时间在线+?其中用户id=?限制1”);
$stmt12->执行(数组($now,$additional\u time\u online,$u