Yii2速率限制Api

Yii2速率限制Api,yii2,Yii2,我担心Yii2速率限制api 什么是速率限制api,为什么使用它 下面是一些来自 一位yii大师能否简单地解释一下这些方法,我应该在何时何地在api中使用速率限制 public function getRateLimit($request, $action) { return [$this->rateLimit, 1]; // $rateLimit requests per second } public function loadAllowance($request, $act

我担心Yii2速率限制api

什么是速率限制api,为什么使用它

下面是一些来自 一位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()
loadAllowment()
saveAllowment()
\yii\filters\RateLimitInterface
接口中包含的三种方法,用户标识类应实现这些方法以启用api的速率限制

getRateLimit()是第一个方法,它返回在x秒内可以执行的最大api调用数:

public function getRateLimit($request, $action) {
    return [1,20]; // There can be 1 api call every 20 seconds
}
loadAllowment()返回剩余允许请求的数量,以及上次选中这些请求的相应UNIX时间戳

public function loadAllowance($request, $action)
{
    return [$this->allowance, $this->allowance_updated_at]; 
}
saveamount()将剩余允许请求的值分配给$this->amount,并将时间戳保存在$this->amount\u updated\u中

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' => 'api\models\User', // User Model for your api
        'enableSession' => false, 
        'loginUrl' => null,        
    ],
2创建用户模型

此模型应实现
\yii\filters\ratelimit接口

这是我的:

class User extends \common\models\User implements \yii\filters\RateLimitInterface
{

    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将自动使用配置为
Yii\rest\Controller
的动作过滤器的
Yii\filters\RateLimiter
执行速率限制检查(如文档中所述)

您必须做的最后一件事是禁用rest控制器行为中的速率限制头:

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
    return $behaviors;
}
什么时候应该在应用程序中使用速率限制

Api调用从数据库返回数据(使用过滤器),因此当调用这些数据时,服务器将执行查询。调用越多,执行的查询数也越多

您必须限制调用的数量,以防止服务器繁重的工作以及由此导致的系统故障

希望这会有所帮助。
我离Yii2指南不远,但我认为我无法用更简单的方式解释这一点。

我实现了每个步骤,但没有显示标题

X-Rate-Limit-Limit
,一段时间内允许的最大请求数
X-Rate-Limit-Remaining
,当前时间段内的剩余请求数
X-Rate-Limit-Reset
,为获得允许的最大请求数而等待的秒数
`

也许Yii2文档可以帮到你很多,并链接以下内容,
您需要更改数据库中的用户表。速率限制对登录的用户生效。

您可以使用速率限制生成器

添加:“ethercreative/yii2 ip速率限制器”:“1.*”


@giovaz,通过yii2的利率限制与使用nginx作为反向代理和利率限制的区别是什么?@fortm这是一个巨大的问题,无法在评论中回答,因为它们有很多不同之处(有两个完全不同的东西)。我建议你就此提出一个问题,我很乐意回答这个问题
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];
}