我最近在这里问:如何知道哪个网站要求使用 php 提供的外部图像?
第三方网站请求图像,例如:
<img src="http://www.myserver.com/mypage.php?api=APIKEY&text=some-text-here" alt=""/>
我需要每小时和每天限制对特定 api 密钥的访问。
现在我在 mysql DB 上存储了一些数据:
id、apikey、limit_ip、limit_referer、limit_hour、limit_day
1、JFKHJSDLGHUFIE、127.0.0.1、*、250、10000
<?php
//Verify Referer
if(
!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER'] == "" ||
!isset($_GET['apik']) || $_GET['apik'] == "" ||
!isset($_SERVER['REMOTE_ADDR']) || $_SERVER['REMOTE_ADDR'] == "") {
exit("API error, your referer informations aren't set");
} else {
//Site referer
$site = $_SERVER['HTTP_REFERER'];
//Ip referer
$ip = $_SERVER['REMOTE_ADDR'];
//Get api key
$apik = htmlentities($_GET['apik']);
try
{
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
);
//MySQL connection
$bdd = new PDO('mysql:host=localhost;dbname=apitest', 'root', '', $options);
}
catch(Exception $e)
{
//If error, die
die('Error: '.$e->getMessage());
}
//Lookup for the apikey in the database
$answer = $bdd->query('SELECT * FROM apiCode WHERE apikey = "'.$apik.'" LIMIT 0,1');
//Fetch settings for this api key
while ($data = $answer->fetch()) {
$limit_ip = $data['limit_ip'];
$limit_referer = $data['limit_referer'];
$limit_hour = $data['limit_hour'];
$limit_day = $data['limit_day'];
}
//Verify API limits
//Cookie, session, database?
//Return content
echo "Api : Success!";
}
我认为最好的方法是在数据库中创建一个表,例如:
id、access_hour、access_day
使用 cron 作业等每小时重置 access_hour 字段,但服务内容需要更多时间,因为 MySQL 太慢了,如果它快的话会更好:)。
Cookie 将存储在远程计算机上,因此不可靠。
会话的持续时间是 15 分钟......所以它太短了,无法存储和限制访问。
以上所有陈述仅代表我的观点。
我的问题是:如何在不影响服务速度的情况下每小时和每天存储和限制特定 API 密钥的访问次数?
- 没有:它只需要快速可靠。