为防止滥用,你应该考虑对您的 API 限流。 例如,您可以限制每个用户 1 分钟内最多调用 API 10 次。 如果在规定的时间内接收了一个用户大量的请求,将返回响应状态代码 429 (这意味着过多的请求)。
一、首先我们找到ActiveController.php 进行初始化
public function init()
{
parent::init();
if ($this->modelClass === null) {
throw new InvalidConfigException('The "modelClass" property must be set.');
}
if (in_array(Yii::$app->requestedRoute, [
'v1/map/search', 'v2/map/search', 'map/search'
])) {
self::controllerLimit([
[
'funciton' => 'v1/map/search',
'time_limit' => 60,
'try_times' => 10,
],
// [
// 'funciton' => 'v2/map/search',
// 'time_limit' => $time_limit,
// 'try_times' => $try_times,
// ],
// [
// 'funciton' => 'map/search',
// 'time_limit' => $time_limit,
// 'try_times' => $try_times,
// ]
], Yii::$app->requestedRoute);
}
}
/** 尝试次数限制
* @param $key
* @param $prefix //前缀,用于跟key组合存redis
* @param $timeLimit //限制的时间
* @param $tryTimes //限制的次数
*/
public static function tryLimit($key, $prefix, $timeLimit, $tryTimes)
{
$times = Yii::$app->redis->get($key . $prefix) ?: 0;
if ($times >= $tryTimes) { //一小时只能获取$tryTimes次
echo '亲,操作太频繁,请过' . round($timeLimit / 60, 2) . '分钟后再来!';
exit;
} else {
Yii::$app->redis->setex($key . $prefix, $timeLimit, $times + 1);
}
}
/** 尝试次数限制
* 通过ip进行限制
*/
public static function controllerLimit($params, $funcName)
{
foreach ($params as $v) {
if ($v['funciton'] == $funcName) {
self::tryLimit($v['funciton'],"test", $v['time_limit'], $v['try_times']);
}
}
}