thinkphp限制IP访问次数-已验证测试通过

本文介绍了如何使用ThinkPHP框架实现IP访问限制功能。当同一IP在一分钟内访问超过50次后,系统将在60秒内阻止其继续访问,并在60秒后解除限制。该方法利用Cache::set()函数进行缓存处理,确保了限制的准确性和时效性。

本文是:1分钟内某IP访问超过50次后,60s内不可继续访问,60s后可继续访问,重复些动作。 Cache::set(变量名,数组或字符串,缓存时间) 变量名:定义存该数组或字符串的命名 缓存时间:单位为秒,触发条件后,会在这个设置的时间内不能继续访问。

已再次优化,解决了保存时间会动态变化导致不准的情况

可直接利用缓存进行处理。

文件路径:app/thinkphp/start.php

namespace think;

use think\Request;

require __DIR__ . '/base.php';


$request = Request::instance();//实例化请求


$ip = $request->ip();//获取IP


$cacheKey = md5($ip);//并进行md5加密。


$cacheKey_arr = Cache::get($cacheKey);//获取缓存里的对应变量名的数组


// print_r($cacheKey_arr);//测试时使用


$now_time = time();


$key_arr['key'] = $cacheKey;


$count_num = 50;//限制访问的次数

$time_long = 60;//限制为多少秒内访问的次数时间



if(empty($key_arr))//为空时,是没有count与time记录的

{
    $key_arr['count'] = 1;//设置访问次数为1次。
    $key_arr['time'] = $now_time;//这里存放开始的时间
}
else
{
    $count = $cacheKey_arr['count'];//存在数组里的访问次数

    $time = $cacheKey_arr['time'];//存在数组里的时间戳

    $diff_time = $now_time-$time;//现在的时间 减去 数组里的时间 的差值

    if($diff_time <=$time_long && $count >=$count_num)//小于等于N秒,且访问次数大于等于N次

    {
        echo "访问过于频繁";//输出到页面展示。

        exit;//这里是要用到这个,不然会继续往后走,限制就没有用。

    }
    elseif($diff_time>$time_long && $count<$count_num)//超过限制时间,未超次数
    {
        $key_arr['count'] = 1;//重置记录次数为1,避免次数一直累加
        $key_arr['time'] = $now_time;//重置开始时间
    }
    else
    {
        $key_arr['count'] = $count+1;//原记录次数上加1
        $key_arr['time'] = $time;//开始时间不变,还是使用数组里的时间
    }

}


Cache::set($cacheKey,$key_arr,60);//更新访问次数 或者用Cache::inc('name',1,1);

//60为缓存的有效时间60秒。不设置或设置为0则为永久缓存, $name为缓存的数据,
//name则为在缓存里的变量名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nengzhen_chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值