Yii2 限速 API

标签 yii2

我担心 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() \yii\filters\RateLimitInterface 中包含三种方法用户身份类应实现的接口(interface)以启用 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->allowance,并将时间戳保存在 $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 设置用户身份类别

config/main.php您的 api 应用程序设置 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 的操作过滤器执行速率限制检查(如文档中所述)。

您要做的最后一件事是在您的休息 Controller 行为中禁用速率限制 header :
public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
    return $behaviors;
}

何时应在应用程序中使用速率限制

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

您必须限制调用次数,以防止服务器繁重的工作和系统的后果。

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

关于Yii2 限速 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37044156/

相关文章:

php - 在 yii2 中的两个日期之间搜索

php - yii2 - 模型加载函数没有设置一些模型属性

mysql - Yii2:如何将表单数据从一个表单保存在两个表中?

rest - 如何在yii2中将数组转换为json

response - Yii2 发送文件响应

php - 在 yii2 中使用客户表代替用户进行基于角色的访问控制

php - 如何在 Yii2 中编写全局函数并在任何 View 中访问它们(不是自定义方式)

activerecord - yii2 中区分大小写的查询

php - Yii 2 : directory structure with AngularJS?

gridview - Yii2 GridView 值调用模型函数