写在前面
这就是为了查看哪些网站在调用这个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压根就到不了这个访问量。