您现在的位置是:网站首页> 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);
}
很赞哦!()




