?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
為防止濫用,你應(yīng)該考慮增加速率限制到您的API。 例如,您可以限制每個(gè)用戶的API的使用是在10分鐘內(nèi)最多100次的API調(diào)用。 如果一個(gè)用戶同一個(gè)時(shí)間段內(nèi)太多的請(qǐng)求被接收, 將返回響應(yīng)狀態(tài)代碼 429 (這意味著過多的請(qǐng)求)。
要啟用速率限制, yii\web\User::identityClass 應(yīng)該實(shí)現(xiàn) yii\filters\RateLimitInterface. 這個(gè)接口需要實(shí)現(xiàn)以下三個(gè)方法:
getRateLimit()
: 返回允許的請(qǐng)求的最大數(shù)目及時(shí)間,例如,[100, 600]
?表示在600秒內(nèi)最多100次的API調(diào)用。loadAllowance()
: 返回剩余的允許的請(qǐng)求和相應(yīng)的UNIX時(shí)間戳數(shù) 當(dāng)最后一次速率限制檢查時(shí)。saveAllowance()
: 保存允許剩余的請(qǐng)求數(shù)和當(dāng)前的UNIX時(shí)間戳。你可以在user表中使用兩列來記錄容差和時(shí)間戳信息。?loadAllowance()
?和?saveAllowance()
?可以通過實(shí)現(xiàn)對(duì)符合當(dāng)前身份驗(yàn)證的用戶 的這兩列值的讀和保存。為了提高性能,你也可以 考慮使用緩存或NoSQL存儲(chǔ)這些信息。
一旦 identity 實(shí)現(xiàn)所需的接口, Yii 會(huì)自動(dòng)使用 yii\filters\RateLimiter 為 yii\rest\Controller 配置一個(gè)行為過濾器來執(zhí)行速率限制檢查。 如果速度超出限制 該速率限制器將拋出一個(gè) yii\web\TooManyRequestsHttpException。 你可以在你的 REST 控制器類里配置速率限制,
public function behaviors(){
$behaviors = parent::behaviors();
$behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
return $behaviors;
}
當(dāng)速率限制被激活,默認(rèn)情況下每個(gè)響應(yīng)將包含以下HTTP頭發(fā)送 目前的速率限制信息:
X-Rate-Limit-Limit
: 同一個(gè)時(shí)間段所允許的請(qǐng)求的最大數(shù)目;X-Rate-Limit-Remaining
: 在當(dāng)前時(shí)間段內(nèi)剩余的請(qǐng)求的數(shù)量;X-Rate-Limit-Reset
: 為了得到最大請(qǐng)求數(shù)所等待的秒數(shù)。