在我们的应用程序中,我们存储了最多的在线用户。我们通过跟踪每个用户当前所在的页面来做到这一点,在登录时,删除处于非活动状态X分钟的用户,然后对在线用户进行计数,如果该值更高,则覆盖最大的在线用户数量。
我们如何改变这一点以跟踪一段时间内的在线用户数量,以便我们可以查看在线用户数量的折线图。我猜我们需要一个cron来每隔1/2/5/10/20/30/60分钟运行一次来跟踪在线数字?那么如何存储这些数据,表会变得非常大。我认为像Statcounter/Analytics这样的公司会有更好的方式来存储这些数据。
如有任何建议,我们将不胜感激。
发布于 2010-11-12 20:10:34
没有办法在更小的空间中存储它。如果你有很长一段时间,你就有一定数量的数据。这取决于登录的数量和间隔的长度,是更好地存储登录还是用户计数的样本。
只需以您需要的最高采样率存储它,很容易在以后按小时对其进行分组:
SELECT YEAR(sample_datetime),
       MONTH(sample_datetime),
       DAY(sample_datetime),
       HOUR(sample_datetime),
       AVG(user_count)
FROM stats
GROUP BY 1,2,3,4发布于 2010-11-12 20:06:06
我们有一个存储登录信息的表,所以我们有一个user_id列和一个login_time列。
但是,您可以将其扩展到涵盖您的会话,并在会话结束时存储一个login_time和logoff_time。这样,您就可以使用一个简单的SQL查询来计算某个时间范围内的会话数量,例如:
SELECT COUNT(*) AS count
FROM sessions
WHERE login_time <= '$yourTime'
AND logoff_time >= '$yourTime'看看会话自定义处理程序上的http://www.php.net/manual/en/session.customhandler.php。
发布于 2010-11-12 20:27:16
正如您已经提到的you,您必须将时间/值对存储在某个地方,可能是在数据库表中。您所需要的就是在线用户的日期/时间和值(一个有2列的表)。
数据点的数量将取决于您想要查询计数器的频率。通常,我不认为轮询频率超过您的不活动阈值是有用的-如果您认为用户在10分钟后不活动,我不会超过每10分钟轮询计数器的频率。
尽管数据量对于大多数数据库来说应该不是问题,但您可能会对感兴趣,或者至少对它的概念感兴趣。我们的想法是,上周有一个非常详细的计数器(每10分钟一个数据点),上个月有一个不太详细的计数器(每4小时),最后一年有一个更详细的计数器(每天),依此类推。以这种方式设置,您在任何时刻都有固定数量的数据点。
https://stackoverflow.com/questions/4164380
复制相似问题