1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 通过IP获取地址 限制某些地址访问(GeoIp)

通过IP获取地址 限制某些地址访问(GeoIp)

时间:2021-10-14 03:51:03

相关推荐

通过IP获取地址 限制某些地址访问(GeoIp)

文章目录

一、前言二、其他免费库三、GeoIp库1、下载对应的mmdb文件,使用github上的库来读取(1)mmdb文件下载地址:(2)github库下载地址2、使用geoip的扩展来读取(1)安装扩展(2)安装好扩展,怎么使用呢(3)根据报错信息调试(4)最终使用示例

一、前言

一说通过IP获取地址,大家肯定都很熟悉了,是咱们经常做的功能之一。网上一查各种免费的IP库也是一大堆,不过这些免费库或多或少都会存在一起问题,为了更适用于项目场景,博主这里选择GeoIp的免费库。

二、其他免费库

大家参考地址:/wangluochong/p/4528401.html

这个博主里面把大概的免费库,比如淘宝IP,新浪,网易等都说了一遍,博主这里就不一一赘述了,有需要的朋友可以直接去用的,博主这里说一下需要注意的地方。

注意:

1、有访问频率限制,不知道现在有没有,之前是限制10qps(例如淘宝IP)2、不支持Https(例如淘宝IP)3、访问可能会超时,需要设置超时时间,毕竟官网有时候都刷不出来(例如淘宝IP)4、可能会有跨域问题,对前端使用不友好(例如淘宝IP)

三、GeoIp库

关于这个库,大家应该也都听说过,这个库名也是php的一个扩展之一。正版的使用是需要花钱的,不过官方还维护的有一个免费的版本,准确度还行,各方面特性也不错,博主这边就是使用的这个免费的库。这里主要介绍两种方法,分别对应的是.dat文件和.mmdb文件。

1、下载对应的mmdb文件,使用github上的库来读取

(1)mmdb文件下载地址:

/download/geoip/database/GeoLite2-Country.mmdb.gz

通过这个地址下载的是官方维护的mmdb文件库,我们需要做的就是读取这个文件,然后通过Ip获取对应的地址。但是这个mmdb文件并不是那么容易读取的,它是一个二进制的文件,我们这里使用github上的一个库来读取它。

(2)github库下载地址

/maxmind/GeoIP2-php

这里需要注意的是,这个库一定要用composer方式来安装,其次是要开启curl扩展,读取的代码类似与下:

这里只是一个简单的php文件,如果是在框架中引用的话会更方便<?phprequire_once 'vendor/autoload.php'; //引入自动加载函数use GeoIp2\Database\Reader; //引入读取的类$reader = new Reader('./geoip.mmdb'); //引入mmdb文件// todo 本地必须开启curl扩展,支持php5.3以上$ip = getIp(); // getIp()是博主获取ip地址的方法,这个大家自己写就行if($ip == "0.0.0.0"){$data = array('status' => "ERR",'country' => "IP地址不合法",'IP'=>$ip);}else {//$record = $reader->country("140.82.113.3");$record = $reader->country($ip);$country = $record->country->isoCode;if ($record) {$data = array('status' => "SUCCESS",'country' => $country,'IP' => $ip);} else {$data = array('status' => "ERR",'country' => "获取地址失败",'IP' => $ip);}}$json = json_encode($data,JSON_UNESCAPED_UNICODE);echo $json; // 输出的就是地址了

2、使用geoip的扩展来读取

(1)安装扩展

dll文件的下载地址:

/package/geoip/1.1.1/windows

找到dll文件一定要下载对应版本的dll文件,可以通过php.ini查看自己的版本信息。把dll文件复制到ext文件夹,重启php,在php.ini找到这个新扩展即可。

(2)安装好扩展,怎么使用呢

安装好扩展之后,博主也是一脸懵逼,这怎么用呢,也没有什么引入文件之类的。后面找到了php对应的一些geoip的函数,咱们直接使用看看:

$ip ='140.82.113.3'; //140.82.113.3 $record = geoip_country_code_by_name($ip); //获取缩写CN

(3)根据报错信息调试

报错:

geoip_country_name_by_name(): Required database not available at C:/xampp/apache/bin/GeoIP.dat

调试:根据报错信息,找到对应的路径,然后下载GeoIp.dat文件

下载路径

//download/geoip/database/GeoIP.dat.gz

提示:这里下载的是.dat文件,不过貌似官方已经不准备维护它了,所以这个库的话,可能会越来越不精准,需要注意下。

(4)最终使用示例

<?phptry {$ip =getIp(); //140.82.113.3 $record = geoip_country_code_by_name($ip); //获取缩写CN//$record = geoip_country_name_by_name(""); //获取China$data = array(// [] 的写法是php5.4之后才有的'status' => "SUCCESS",'country' => $record);}catch(Exception $err){$data = array('status' => "ERR",'country' => $err->getMessage());}$json = json_encode($data);echo $json;

总结:

整体来说,GeoIp的免费库用起来是比国内大厂维护的IP库要复杂一些的,如果你需要在前端获取IP进行限制的话,那么最好是选用新浪或者网易的IP库。如果是大型企业级应用的话,可以考虑使用免费的GeoIp的库或者花钱使用官方库都可以的,使用的时候,建议是用composer安装工具来解析mmdb文件。

end

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。