我正在编写一个用户系统,并为所有用户提供统计信息,我希望能够为他们提供他们在我的网站上活跃的小时数。
我最初的想法是如何做到这一点: 用户加载页面,用户的记录存储在名为accessLog 的SQL表中 *用户加载另一个页面,运行sql查询以查看他们上次访问页面的时间* 如果用户在过去两分钟内访问了某个网页,请更新其用户帐户并添加在线时间 *在accessLog *
中插入新记录然而,这意味着可能会向我网站的每一页添加4个额外查询,这似乎很慢。我在想,必须有一种更有效的方式来跟踪用户在线活动,我显然太傻了!
答案 0 :(得分:3)
我这样做很简单:
通过这种方式,我可以准确地跟踪用户。只需要除以60来获得时间。
答案 1 :(得分:2)
我的理念是:在成为问题之前不要过分关注效率。除非您的网站流量非常大,否则您将不会注意到这四个查询。但这可能更简单:
答案 2 :(得分:2)
我会使用ajax让客户端花大约一分钟时间调用服务器。只是告诉服务器用户仍在观看该页面。
服务器在数据库中具有lastTimestamp和totalTimeSpentOnSite。 lastTimestamp只是最后一次发生ajax请求或页面加载。
每次ajax触发服务器时都会计算now - lastTimestamp
并将其添加到totalTimeSpentOnSite。
为了使它更准确你可以
将javascript侦听器添加到onBlur()
以仅记录该窗口活动所花费的实际时间,然后将该时间发送到服务器,而不是仅告诉服务器该用户仍处于活动状态。
答案 3 :(得分:1)
将其添加到会话管理中。当用户开始他们的会话记录他们的开始时间。当用户结束他们的会话记录他们的结束时间。简单的数学计算将为您收集他们在您网站上每次会话的总时间。
回答Filip Haglund
是的,但你必须等待会话超时,而这段时间并不反映用户在关闭之前在最后一页上花费的实际时间。
这是真的但是又一次,到目前为止所有可用的答案都在同一个基本前提下工作:
只是在用户离开时需要会话时进行记录。我不知道PHP中的任何其他方式可以按照OP的方式跟踪用户活动。更新数据库表是一个技术问题。你想用CRON工作吗?你想使用AJAX吗?你想做别的吗?
如果您确实想知道实际发生了多少活动,您可以发送某些JavaScript事件的AJAX请求。这会将时间跟踪与实际的浏览器事件联系起来。当然,这意味着您的时间跟踪依赖于启用JavaScript。
答案 4 :(得分:1)
“两分钟”规则有点不可靠 - 你可能会陷入困境,试图弄清楚“花费的时间”究竟意味着什么。
在之前的项目中,我们做了以下工作。
在每次加载页面时,我们检查用户是否有当前会话,如果没有,则创建一个GUID来识别当前会话。
我们使用datetime,GUID,页面URL和用户ID(如果用户已登录)向数据库写了一条日志记录。
为计算“花费的时间”,我们计算了会话GUID的第一个和最后一个记录之间的时差,并添加了一分钟以反映在最后一页上花费的时间。
这不完全准确,但它可以实时运行,而不需要CRON用于具有适度流量的站点。
答案 5 :(得分:0)
2问题是: - 如果用户在页面中停留超过持续时间(10分钟)而没有刷新,则认为他已断开连接。 - 未保存最后一页的持续时间
Piwik就是那样的
答案 6 :(得分:0)
这是我使用的方法,它在用户加载任何页面时都会检查数据库的更新。 数据是准确的,因为它会计算用户是否每分钟加载一页,如果这样,则会将时间差添加到数据库中。
$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));