为什么不用Mysql来做?
MySQL是关系型数据库,主要󠄐󠄹󠅀󠄪󠄣󠄞󠄡󠄤󠄨󠄞󠄡󠄠󠄨󠄞󠄢󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄠󠄢󠄣󠄩󠄠󠄤󠄦󠄬󠅒󠅢󠄟󠄮󠇕󠅰󠆖󠇖󠅴󠅿󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮用于存放持久化数据,将数据存储在硬盘中,读取需要IO操作,所以速度较慢
Redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能󠄐󠄹󠅀󠄪󠄣󠄞󠄡󠄤󠄨󠄞󠄡󠄠󠄨󠄞󠄢󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄠󠄢󠄣󠄩󠄠󠄤󠄦󠄬󠅒󠅢󠄟󠄮󠇕󠅰󠆖󠇖󠅴󠅿󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮够大大的提高运行效率,但是保存时间有限
代码实现:
代码转载自:https://guihet.com/redisip.html
1.新建一个文件IPRestrict.php
<?php
/**
* PHP实现redis限制单ip、单用户的访问次数功能
**/
class IPRestrict {
/**
* @var Redis
*/
private stat󠄐󠄹󠅀󠄪󠄣󠄞󠄡󠄤󠄨󠄞󠄡󠄠󠄨󠄞󠄢󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄠󠄢󠄣󠄩󠄠󠄤󠄦󠄬󠅒󠅢󠄟󠄮󠇕󠅰󠆖󠇖󠅴󠅿󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮ic $redis;
/**
* @var string
* 取客户端真实ip地址作为key
*/
private static $realip;
public function __construct($host = '127.0.0.1', $port = 6379, $auth = null) {
self::$redis = new Redis();
self::$redis->connect('127.0.0.1', 6379);
$auth && self::$redis->auth($auth);
󠄐󠄹󠅀󠄪󠄣󠄞󠄡󠄤󠄨󠄞󠄡󠄠󠄨󠄞󠄢󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄠󠄢󠄣󠄩󠄠󠄤󠄦󠄬󠅒󠅢󠄟󠄮󠇕󠅰󠆖󠇖󠅴󠅿󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮 self::$realip = self::getRealIP();
}
/**
* 取得客户端IP地址
* @return string
*/
public static function getRealIP() {
$real󠄐󠄹󠅀󠄪󠄣󠄞󠄡󠄤󠄨󠄞󠄡󠄠󠄨󠄞󠄢󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄠󠄢󠄣󠄩󠄠󠄤󠄦󠄬󠅒󠅢󠄟󠄮󠇕󠅰󠆖󠇖󠅴󠅿󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮ip = "";
if (isset($_SERVER)) {
foreach(['HTTP_X_FORWARED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'] as $name) {
if (isset($_SERVER[$name])) {
$realip = $_SERVER[$name];
break;
}
󠄐󠄹󠅀󠄪󠄣󠄞󠄡󠄤󠄨󠄞󠄡󠄠󠄨󠄞󠄢󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄠󠄢󠄣󠄩󠄠󠄤󠄦󠄬󠅒󠅢󠄟󠄮󠇕󠅰󠆖󠇖󠅴󠅿󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮 }
} else {
$realip = getenv('HTTP_X_FORWARDED_FOR') || getenv('HTTP_CLIENT_IP') || getenv('REMOTE_ADDR');
}
return $realip;
}
/**
* 记录该ip的访问次数 也可改成用户id
* @pa󠄐󠄹󠅀󠄪󠄣󠄞󠄡󠄤󠄨󠄞󠄡󠄠󠄨󠄞󠄢󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄠󠄢󠄣󠄩󠄠󠄤󠄦󠄬󠅒󠅢󠄟󠄮󠇕󠅰󠆖󠇖󠅴󠅿󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮ram int $limit 限制指定时间内的访问磁珠
* @param int $time 限制时间为60秒
* @return int
* @throws HttpException
*/
public function requestCount($limit = 120, $time = 60) {
$key = self::$realip;
$redis = self::$redis;
/**
* @var bool
*/
$exists = $redis->exists($key);
$redis->incr($key);
if ($exists) {
$count = $redis->get($key);
if ($count > $limit) {
die('请求太频繁,请稍后再试!'.$count);
}
} else {
// 首次计数 设定过期时间
$redis->expire($key, $time);
}
// return $redis->get($key);
}
}
?>
2.在你需要限制的API文件内加上
<?php
include 'IPRestrict.php';
$restrict = new IPRestrict();
echo $restrict->requestCount();
?>
© 版权声明
THE END
暂无评论内容