我担心Yii2限速api?
什么是速率限制api,为什么使用它?
以下是Yii2的一些方法一个yii大师能简单地解释这些方法吗?我应该在哪里以及什么时候在我的api中使用速率限制?
public function getRateLimit($request, $action)
{
return [$this->rateLimit, 1]; // $rateLimit requests per second
}
public function loadAllowance($request, $action)
{
return [$this->allowance, $this->allowance_updated_at];
}
public function saveAllowance($request, $action, $allowance, $timestamp)
{
$this->allowance = $allowance;
$this->allowance_updated_at = $timestamp;
$this->save();
}
方法
getRateLimit()
、loadAllowance()
和saveAllowance()
是包含在yiifiltersRateLimitInterface
接口中的三个方法,用户标识类应该实现这些方法来启用api的速率限制。
getRateLimit()是第一个方法,它返回x秒内可以执行的最大api调用数:
public function getRateLimit($request, $action) {
return [1,20]; // There can be 1 api call every 20 seconds
}
loadAllowance()返回剩余允许的请求数以及上次选中这些请求时的相应UNIX时间戳。
public function loadAllowance($request, $action)
{
return [$this->allowance, $this->allowance_updated_at];
}
saveAllowance()将剩余允许请求的值分配给$this->allocation,并将时间戳保存在$this->allowance_update_at中。
public function saveAllowance($request, $action, $allowance, $timestamp)
{
$this->allowance = $allowance; //Saving Remaining Requests
$this->allowance_updated_at = $timestamp; // Saving Timestamp
$this->save(); //Save the model
}
实施
这就是在我的示例应用程序(使用高级模板)中实现速率限制的方式:
1设置用户身份类别
在api应用程序的config/main.php
中,设置user
组件。
'user' => [
'identityClass' => 'apimodelsUser', // User Model for your api
'enableSession' => false,
'loginUrl' => null,
],
2创建用户模型
此模型应实现yiifiltersRateLimitInterface
:
这是我的:
class User extends commonmodelsUser implements yiifiltersRateLimitInterface
{
public $rateLimit = 1;
public $allowance;
public $allowance_updated_at;
public function getRateLimit($request, $action) {
return [$this->rateLimit,1];
}
public function loadAllowance($request, $action)
{
return [$this->allowance, $this->allowance_updated_at];
}
public function saveAllowance($request, $action, $allowance, $timestamp)
{
$this->allowance = $allowance;
$this->allowance_updated_at = $timestamp;
$this->save();
}
}
在这两个步骤之后,Yii将自动使用配置为yiirestController
的动作过滤器的yiifiltersRateLimiter
来执行速率限制检查(如文档中所引用的)。
你必须做的最后一件事是在你的休息控制器行为中禁用速率限制标题:
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
return $behaviors;
}
何时应在应用程序中使用速率限制
Api调用从数据库返回数据(带有过滤器),因此当调用它们时,服务器会执行查询。调用越多,执行的查询数量也越多,
您必须限制调用次数,以防止服务器繁重的工作以及由此产生的系统后果。
希望这会有所帮助。我离Yii2指南不远了,但我认为我无法用更简单的方式来解释这一点。
也许Yii2文档可以帮你很多忙,并链接以下内容,http://www.yiiframework.com/doc-2.0/guide-rest-rate-limiting.html您需要更改数据库中的用户表。速率限制对用户登录和生效
我实现了每个步骤,但没有显示标题
X-Rate-Limit-Limit
,一段时间内允许的最大请求数X-Rate-Limit-Remaining
,当前时间段内剩余的请求数X-Rate-Limit-Reset
,为获得允许的最大请求数而等待的秒数`
您可以使用速率限制作曲家。
添加:"ethernecreative/yii2 ip速率限制器":"1.*"
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['rateLimiter'] = [
// Use class
'class' => RateLimiter::className(),
'rateLimit' => 1,
'timePeriod' => 2,
'separateRates' => false,
'enableRateLimitHeaders' => false,
];
return $behaviors;
}
public function getRateLimit($request, $action) {
$id = $action->getUniqueId();
$limits = [
'user/login' => [20,10],
'article/index' => [100,10],
.......
'other' => [50,10]
];
if(!array_key_existe($id,$limits)) $id = 'other';
return $limits[$id];
}