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