写在前面
这就是为了查看哪些网站在调用这个API,以及它们的调用频率是多少,
这样可以为后期限制请求量做铺垫。
何为铺垫?
就是在地上铺一层垫子~
意淫开始:
未来,在用户系统中加入会员制
(两种注册方式:
1.普通弱智验证码;
2.高级:化学、历史、矩阵验证码)
高级的上限可能是无限。。
会员可以添加自己的请求域名到系统里面。
意淫结束。
思路
请教了几个搜索引擎都没找到方法,就自己想了一个方案:
建一个数据表,请求一次就写入一行数据(包括域名,时间),
读取的时候用一个函数,可以获取到指定时间内域名的访问情况,
但是,这里有一个问题,数据库会不断增大到数据库爆炸。。
于是,再写一个函数用来删除今天之前的数据。
代码
1.记录部分
//record visit event
function visit_record($visitor, $visit_time)
{
//删除过期数据
delete_outdate_visit();
$db = new DB;
$array_visit = array(
'visitor' => $visitor,
'visit_time' => $visit_time
);
$result = $db->insert_array('visit', $array_visit);
if ($result) {
$db->close();
return true;
} else
exit($db->error());
}
2.读取部分
//in $in_time seconds.
function visit_read($in_time)
{
$time = $_SERVER['REQUEST_TIME'] - $in_time;
$db = new DB;
$query = $db->query("SELECT * FROM `visit` WHERE `visit_time` > $time ");
$visitor = array();
while ($fetch = $db->fetch($query)) {
//统计
if (isset($visitor[$fetch['visitor']])) {
$visitor[$fetch['visitor']]['times']++;
} else {
$visitor[$fetch['visitor']] = array('times' => 1);
}
}
//今天的全部请求数
$all_hit = $db->count('SELECT count(*) FROM `visit` WHERE `visit`.`visit_time` > ' . ($_SERVER['REQUEST_TIME'] - 86400));
$result = array(
'visit_details' => $visitor,
'all_hit' => $all_hit,
);
return $result;
}
3.删除部分
//删除今天零点之前的数据(Delete data older than 00:00:00 today)
function delete_outdate_visit()
{
$db = new DB;
$sql = 'DELETE FROM `visit` WHERE `visit`.`visit_time` < ' . strtotime(date('Y-m-d', time()));;
$result = $db->query($sql);
if (!$result)
exit($db->error());
$db->close();
return TRUE;
}
注意
代码仅供参考,对于数组输出的问题请自行解决。
暂时因为虚拟主机限制,我没有更好的解决办法,
小量访问还是可行的,一旦达到一天之内上万的访问量,
我也不知道会发生什么,因为我的API压根就到不了这个访问量。
代码仅供参考,对于数组输出的问题请自行解决。
暂时因为虚拟主机限制,我没有更好的解决办法,
小量访问还是可行的,一旦达到一天之内上万的访问量,
我也不知道会发生什么,因为我的API压根就到不了这个访问量。

