php用户访问频率,检查/设置用户访问频率

/**

* 检查/设置用户访问频率 指定 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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值