您现在的位置是:网站首页> php专栏 常见问题
api接口限制访问
亦然2019-07-25 10:00:44【常见问题】人已围观
简介在接口开发工作中很常见会用到限时访问功能,目的是用来防止恶意攻击和流量限制。比如每个用户每分钟只允许调用一次接口。或者发表评论中,每个用户五分钟之内只能提交一次评论。本文我们就来实现一个简单的限时访问。
简单介绍两个例子来实现api接口的限制访问功能。
1.限制用户在某一时间段多次访问接口。这里我们只说业务上的简单处理,不涉及限流算法。
定义一个时间间隔的常量,当用户提交留言时,通过user_id去查询该用户上一条留言时间,把这个时间加上时间间隔,小于当前时间才可以去执行下一步操作。反之需要等待最后时间+间隔秒数-当前时间的秒数值。
//定义时间间隔秒数 $config_time = config('maccms')['comment']['timespan']; if($param['user_id']){ $lasttime = Db::connect(config('database1')) ->name('comment') ->where(['user_id'=>$param['user_id']]) ->order('comment_time desc') ->find(); //接口延迟秒数 $second = ($lasttime['comment_time'] + $config_time) - time(); if((int)($lasttime['comment_time'] + $config_time) > time()){ return json(['code'=>0,'msg'=>'请在'.$second.'秒后操作']); } }
实现效果如下:
public function test() { $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $data=$redis->exists("ad_info"); // 锁不存在,就执行业务代码 if (!$data) { // 在 Redis 中存一个有效期60秒的缓存锁 $redis->set('ad_info', "1", 60); $data=['code' => 200, 'message' => '可以访问', 'data' => 'somthing']; var_dump($data); } $data=['code' => 422, 'message' => '每分钟只允许调用一次']; var_dump($data); }
很赞哦!()