php ip次数限制,PHP结合Redis来限制用户或者IP某个时间段内访问的次数

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

//获取客户端真实ip地址

function get_real_ip(){

static $realip;

if(isset($_SERVER)){

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){

$realip=$_SERVER['HTTP_X_FORWARDED_FOR'];

}else if(isset($_SERVER['HTTP_CLIENT_IP'])){

$realip=$_SERVER['HTTP_CLIENT_IP'];

}else{

$realip=$_SERVER['REMOTE_ADDR'];

}

}else{

if(getenv('HTTP_X_FORWARDED_FOR')){

$realip=getenv('HTTP_X_FORWARDED_FOR');

}else if(getenv('HTTP_CLIENT_IP')){

$realip=getenv('HTTP_CLIENT_IP');

}else{

$realip=getenv('REMOTE_ADDR');

}

}

return $realip;

}

//这个key记录该ip的访问次数 也可改成用户id

$key = get_client_ip(); //该Key记录访问的次数,目前是以IP为例,也可以把用户id作为key,如userid_123456

//限制次数为3次。

$limit = 3;

$check = $redis->exists($key);

if($check){

$redis->incr($key);

$count = $redis->get($key);

if($count > 3){

exit('已经超出了限制次数');

}

}else{

$redis->incr($key);

//限制时间为60秒

$redis->expire($key,60);

}

$count = $redis->get($key);

echo '第 '.$count.' 次请求';

获取ip方法

function get_real_ip() {

static $realip = NULL;

if ($realip !== NULL) {

return $realip;

}

if (isset($_SERVER)) {

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {

$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);

/* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */

foreach ($arr AS $ip) {

$ip = trim($ip);

if ($ip != 'unknown') {

$realip = $ip;

break;

}

}

} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {

$realip = $_SERVER['HTTP_CLIENT_IP'];

} else {

if (isset($_SERVER['REMOTE_ADDR'])) {

$realip = $_SERVER['REMOTE_ADDR'];

} else {

$realip = '0.0.0.0';

}

}

} else {

if (getenv('HTTP_X_FORWARDED_FOR')) {

$realip = getenv('HTTP_X_FORWARDED_FOR');

} elseif (getenv('HTTP_CLIENT_IP')) {

$realip = getenv('HTTP_CLIENT_IP');

} else {

$realip = getenv('REMOTE_ADDR');

}

}

// 使用正则验证IP地址的有效性,防止伪造IP地址进行SQL注入攻击

preg_match("/[\d\.]{7,15}/", $realip, $onlineip);

$realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';

return $realip;

}

8d5bbcce71b746c782ac573e1f1d9dce.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值