技术饭

判断用户请求频繁度,防止机器请求

copylian    0 评论    3189 浏览    2020.05.03

判断用户请求频繁度,防止机器请求,订单秒杀、刷票、刷红包等活动,经常有人通过机器来刷,机器一秒请求上百次甚至上千、上万次,那么这个时候正常用户就没法玩了,接口就会被刷爆掉,所以我们在写代码的时候经常需要做很多的验证来防止被刷。

/**

 * @desc 判断用户请求频繁度,防止机器请求

 * @author copylian@aikehou.com

 * @param int $checkTime 请求间隔秒数

 * @param string $id 标识符

 * @return boolean 频繁或者不频繁

 */

function check_request_time($checkTime = 1, $id = MODULE_NAME.CONTROLLER_NAME.ACTION_NAME) {

        $request_time = microtime ( true ); // 1460357300.6969

        $request_time_arr=session ( "request_time" );

        $last_request_time=0;

        $id=md5("HDD".$id);

        if(isset( $request_time_arr[$id] )){

                $last_request_time = intval ( $request_time_arr[$id]);

        }

        if ($last_request_time > 0 && ($request_time - $last_request_time) < $checkTime) {

                return false;

        }

        $request_time_arr=is_array($request_time_arr)?$request_time_arr:array();

        $request_time_arr[$id]=$request_time;

        session ( "request_time", $request_time_arr );

        return true;

}

/**

     * [check_request_time 限制访问时间:使用redis比较高效]

     * @param  integer $checkTime [限制时间]

     * @param  string  $id        [唯一的ID]

     */

    private function check_request_time($checkTime = 10, $id = ''){

        if(empty($id)){

            return false;

        }

        $id = md5("hltt".$id);

        $request_time = microtime(true);

        $request_time_value = \Cache::store('redis')->get('hltt_request_time_'.$id);

        $last_request_time = 0;

        if(isset($request_time_value) && !empty($request_time_value)){

           $last_request_time = intval($request_time_value);

        }

        if ($last_request_time > 0 && ($request_time - $last_request_time) < $checkTime) {

            return false;

        }

        //$request_time_arr=is_array($request_time_arr) ? $request_time_arr : array();

        $request_time_value = $request_time;

        //cache("request_time", $request_time_arr);

        \Cache::store('redis')->set('hltt_request_time_'.$id, $request_time_value, $checkTime);

        return true;

    }

飓风呀
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!
用户 请求 频繁 机器 

文明上网理性发言!

  • 还没有评论,沙发等你来抢