先写一个基类,让所有的api的控制器都继承它,并且写一个_initialize方法,这是tp5的方法,执行其他方法前,会自动调用,类似于php的构造方法,我们可以获取请求者的ip,md5一下作为我们redis存储的key
然后去redis里用get去取,如果取到了值,则去判断是否为空,如果为空,则说明该ip第一次请求接口,则设置用set方法设置初始值为0,并且设置有效时间,如果不为空,并且大于了我们设置的请求次数,则不进行数据库操作,直接返回提示,如果小于我们设置的请求次数,则自增1
namespace app\api\controller;
use \think\Controller;
use think\cache\driver\Redis;
class Check extends Controller
{
protected function _initialize(){
//api接口限流
$num = config('api_num');//每多少秒可以请求的次数
$time = config('api_time');//多少秒内
$ip = get_client_ip();
$redis_key = md5($ip);
$redis = new Redis();
$count = $redis->get($redis_key);
if(empty($count)){
$redis->set($redis_key,1,$time);
}else if($count >= $num){
msg(0,'请求频率太高,请重试');
}else{
$redis->inc($redis_key);
}
}
}
版权属于:本文是原创文章,版权归 吾梦小站 所有。
本文链接:https://nikm.cn/archives/29.html
本站所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由地转载和修改,但请务必注明文章来源并且不可用于商业目的。