Yii2速率限制Api

时间:2016-05-05 06:45:29

标签: yii2

我担心Yii2限速api?

什么是限速api,为什么会这样使用?

以下是Yii2的一些方法 yii大师可以用简单的词语解释这些方法,我应该在何时何地使用速率限制?

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();
} 

5 个答案:

答案 0 :(得分:7)

方法

getRateLimit()loadAllowance()saveAllowance()\yii\filters\RateLimitInterface Inteface中包含的三种方法,用户标识类应该实现这些方法以启用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->分配剩余允许请求的值并将时间戳保存在$ this-> allowance_updated_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' => 'api\models\User', // User Model for your api
        'enableSession' => false, 
        'loginUrl' => null,        
    ],

2创建用户模型

这个模型应该实现\yii\filters\RateLimitInterface

这是我的:

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\filters\RateLimiter配置为yii\rest\Controller的操作过滤器来执行速率限制检查(如文档中所述)。

您要做的最后一件事是禁用其余控制器行为中的速率限制标头:

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
    return $behaviors;
}

当您在应用程序中使用限制时

Api调用从数据库返回数据(带有过滤器),因此当它们被调用时,服务器执行查询。调用的次数越多,执行的查询数也越多,

您必须限制通话次数,以防止服务器繁重工作以及导致系统影响。

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

答案 1 :(得分:1)

我实施了每一步但未显示标题

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

答案 2 :(得分:1)

也许Yii2文档可以帮到你很多,并链接以下, http://www.yiiframework.com/doc-2.0/guide-rest-rate-limiting.html 您需要在数据库中更改用户表。速率限制对用户登录

生效

答案 3 :(得分:0)

你可以使用速率限制作曲家。

添加:&#34; ethercreative / yii2-ip-ratelimiter&#34;:&#34; 1. *&#34;

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['rateLimiter'] = [
        // Use class
        'class' => RateLimiter::className(),

        'rateLimit' => 1,
        'timePeriod' => 2,

        'separateRates' => false,
        'enableRateLimitHeaders' => false,
    ];
    return $behaviors;
}

答案 4 :(得分:-1)

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];
}