1

每次访问我的网站都会更新用户的个人点击计数器,并time()根据存储在 cookie 中的 ip 地址和 id 更新一列。因此,当输出数据时,我的以下代码使用更少的数据库调用是一种更有效的方法,因为它本质上是自身的副本:

<?
$last1Min = time()-60;
$last5Mins = time()-300;
$last1Hr = time()-6000;
$last1Dy = time()-144000;
$last1Wk = time()-1008000;
$last1Mnth = time()-30240000;

//last1Min
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Min";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last minute: " . $rows['COUNT(*)'] . "<br />\n";
}

//last5Mins
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last5Mins";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last 5 minutes: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Hr
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Hr";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last hour: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Dy
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Dy";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last day: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Wk
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Wk";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last week: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Mnth
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Mnth";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last month: " . $rows['COUNT(*)'] . "<br /><br />\n";
}

如果有更有效的方式来呈现这些数据,我想扩展它,不仅显示在我的整个网站上在线的每个指标有多少用户,而且记录和输出我网站上每个页面的数据.

4

4 回答 4

5
SELECT 
  SUM(lastOnline <= 60) AS one_minute,
  SUM(lastOnline <= 300) AS five_minutes,
  ...
  SUM(lastOnline <= 30240000) AS one_month
FROM usersonline

使用这种方法,您可以通过单次表扫描在单个查询中获得所需的一切;没有比这更有效的了。正如其他人所提到的,您应该缓存结果,因为它相对昂贵(即使是这种优化形式)。在每次页面加载时计算这一点是没有意义的,特别是如果您看到每秒多次点击(例如,如果您点击 digg 的首页,这极有可能)

lastOnline <= 60 对于条件为真的行计算为 1,对于条件为假的行计算为 0;SUM() 将这些 1 和零相加,为您提供条件为真的行数。

几年前从 mysql 文档中的用户评论中学到了这种技术;其他地方也有类似的例子

于 2009-05-21T00:22:55.637 回答
3

设置一个 cron 作业,每分钟/5 分钟/等等只计算一次正确的值。缓存结果并改为显示。当它们每分钟或每半小时只更改一次时,真的没有必要每秒计算 X 次此类统计数据。

于 2009-05-21T00:04:42.477 回答
0

无需每次调用​​数据库,您只需在上个月内调用所有数据并按日期排序。然后在 php 中,您可以比较日期和时间以查看用户上次登录的时间。

于 2009-05-21T00:01:36.820 回答
0

如果您将会话保存到文件中,您可以计算一段时间内访问过的文件数。然后根本就没有数据库访问权限。

于 2009-05-21T00:30:06.683 回答