我担心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();
}
Run Code Online (Sandbox Code Playgroud)
方法
getRateLimit(),loadAllowance()并且saveAllowance()是\yii\filters\RateLimitInterfaceInteface中包含的三个方法,用户标识类应该实现这三个方法来启用api的速率限制.
getRateLimit()是第一个方法,它返回你可以在x秒内完成的最大api调用次数:
public function getRateLimit($request, $action) {
return [1,20]; // There can be 1 api call every 20 seconds
}
Run Code Online (Sandbox Code Playgroud)
loadAllowance()返回剩余允许请求的数量,以及上次检查这些请求的相应UNIX时间戳.
public function loadAllowance($request, $action)
{
return [$this->allowance, $this->allowance_updated_at];
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
实施
这是我在示例应用程序中实现速率限制的方法(使用高级模板):
1设置用户标识类
在config/main.php您的api应用程序中设置user组件.
'user' => [
'identityClass' => 'api\models\User', // User Model for your api
'enableSession' => false,
'loginUrl' => null,
],
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
在这两个步骤之后,Yii将自动使用yii\filters\RateLimiter配置为动作过滤器yii\rest\Controller来执行速率限制检查(如文档中所述).
您要做的最后一件事是禁用其余控制器行为中的速率限制标头:
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
return $behaviors;
}
Run Code Online (Sandbox Code Playgroud)
当您应该在您的申请中使用限制时
Api调用从数据库返回数据(带有过滤器),因此当它们被调用时,服务器执行查询.调用的次数越多,执行的查询数也越多,
您必须限制呼叫数量,以防止服务器繁重工作以及导致系统崩溃.
希望这会有所帮助.我不会远离Yii2指南,但我认为我不能以简单的方式解释这一点.