橘子味的心
判断用户请求频繁度,防止机器请求
判断用户请求频繁度,防止机器请求
发布于:

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


/**
 * @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;
}


阅读 0

分类

    热门排行