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