yii2 RESTful API  實現限流

爲防止濫用,你應該考慮對您的 API 限流。 例如,您可以限制每個用戶 1 分鐘內最多調用 API 10 次。 如果在規定的時間內接收了一個用戶大量的請求,將返回響應狀態代碼 429 (這意味着過多的請求)。

一、首先我們找到ActiveController.php 進行初始化


 public function init()
    {
        parent::init();
        if ($this->modelClass === null) {
            throw new InvalidConfigException('The "modelClass" property must be set.');
        }

        if (in_array(Yii::$app->requestedRoute, [
            'v1/map/search', 'v2/map/search', 'map/search'
        ])) {
            
            self::controllerLimit([
                [
                    'funciton' => 'v1/map/search',
                    'time_limit' => 60, 
                    'try_times' => 10,
                ],
                //  [
                //     'funciton' => 'v2/map/search',
                //     'time_limit' => $time_limit, 
                //     'try_times' => $try_times,
                // ],
                //  [
                //     'funciton' => 'map/search',
                //     'time_limit' => $time_limit, 
                //     'try_times' => $try_times,
                // ]
            ], Yii::$app->requestedRoute);
        } 

    }

      /** 嘗試次數限制
     * @param $key
     * @param $prefix //前綴,用於跟key組合存redis
     * @param $timeLimit //限制的時間
     * @param $tryTimes //限制的次數
     */
    public static function tryLimit($key, $prefix, $timeLimit, $tryTimes)
    {
        $times = Yii::$app->redis->get($key . $prefix) ?: 0;
       

        if ($times >= $tryTimes) { //一小時只能獲取$tryTimes次
           
          echo  '親,操作太頻繁,請過' . round($timeLimit / 60, 2) . '分鐘後再來!';
           
          exit;
        } else {
            Yii::$app->redis->setex($key . $prefix, $timeLimit, $times + 1);
        }
    }

   /** 嘗試次數限制
   * 通過ip進行限制
   */
    public static function controllerLimit($params, $funcName)
    {
        foreach ($params as $v) {

            if ($v['funciton'] == $funcName) {
                self::tryLimit($v['funciton'],"test", $v['time_limit'], $v['try_times']);
            }
        }
    }

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章