欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

检查/设置用户访问频率

程序员文章站 2022-05-31 17:24:21
...
检查/设置用户访问频率 指定 user_marked在 time_slot 秒内最多访问 count次;
/**
* 检查/设置用户访问频率 指定 user_marked在 time_slot 秒内最多访问 count次;
* @param $lime_slot 时间片 单位秒
* @param $count 整数
* @param $user_marked 用户唯一标示,默认为客户端IP
* @return array('status'=>1,'info'=>'')
* @author leeyi
*/
function check_rate_limiting($time_slot, $count, $user_marked='') {
$user_marked = empty($user_marked) ? get_client_ip() : $user_marked;
$cache_key = 'rate.limiting:'.$user_marked;
$redis = new \Redis;
$options = array (
'host' => C('REDIS_HOST') ? C('REDIS_HOST') : '127.0.0.1',
'port' => C('REDIS_PORT') ? C('REDIS_PORT') : 6379,
'timeout' => C('DATA_CACHE_TIMEOUT') ? C('DATA_CACHE_TIMEOUT') : false,
);
$res = $redis->connect($options['host'], $options['port'], $options['timeout']);
$ret = array('status'=>0, 'info'=>'');
if( false===$res) {
$ret['info'] = '链接Redis失败';
return $ret;
}
$redis->expire($cache_key, $time_slot); // 设置过期时间
$list_len = $redis->llen($cache_key);
if( $list_len $redis->lpush($cache_key, NOW_TIME);
$ret['status'] = 1;
} else {
$datetime = $redis->lindex($cache_key, -1); // -1 标示列表最后一个元素
if( (NOW_TIME-$datetime) $ret['info'] = '访问频率超过了限制,请稍后重试。';
// $redis->ltrim($cache_key, -1, 0); //清空列表
} else {
$redis->lpush($cache_key, NOW_TIME);
//
$redis->ltrim($cache_key, 0, $count-1);
$ret['status'] = 1;
}
}
1==$ret['status'] && $ret['info'] = $list_len+1;
return $ret;

}

AD:真正免费,域名+虚机+企业邮箱=0元