当前位置: 移动技术网 > IT编程>开发语言>PHP > ThinkPHP使用UTFWry地址库进行IP定位实例

ThinkPHP使用UTFWry地址库进行IP定位实例

2019年06月04日  | 移动技术网IT编程  | 我要评论

可以在官网的 http://www.thinkphp.cn/extend/223.html下载ip定位扩展类库,或者下载扩展包( http://www.thinkphp.cn/down/253.html)里面也已经包含该扩展类了。如果是单独下载的上传类库,把解压后的iplocation.class.php 放入thinkphp/extend/library/org/net/(如果没有请手动创建)目录下面。

一、获取ip地址

如果你仅仅需要获取用户访问的ip地址,那么直接使用系统内置的get_client_ip函数即可,该函数是thinkphp标准模式内置方法,可以直接使用,比php内置的系统变量$_server['http_client_ip']具有更好的兼容性,用法:

复制代码 代码如下:
$ip = get_client_ip();

get_client_ip支持ip地址的多种情况检测和合法性验证,返回值就是获取到的ip地址,如果获取到的ip地址非法,将返回0.0.0.0。
如果需要,也可以返回ipv4地址数字,例如:

复制代码 代码如下:
$ip = get_client_ip(1);

返回的结果可能类似于:

复制代码 代码如下:
2130706433

可用于地址范围和比较。

二、ip地址定位
仅仅获取ip地址并不能完全满足应用的需求,只能记录下来用于日后的日志分析需要,ip地址定位功能可以让你获取用户的所在区域。要使用ip定位功能,除了需要iplocation扩展类库之外,还需要ip地址库文件,由于thinkphp默认采用utf8编码,因此最好是utf8格式的ip地址库文件,如果是纯真gbk编码的ip地址库文件,则需要对获取结果进行编码转换(下面会提到),可以在这里下载utf8编码的地址库文件: http://www.thinkphp.cn/extend/270.html
解压后的地址库文件utfwry.dat放入iplocation扩展类库所在目录下面即可。
使用方法:

复制代码 代码如下:
import('org.net.iplocation');// 导入iplocation类
$ip = new iplocation(); // 实例化类
$location = $ip->getlocation('218.79.93.194'); // 获取某个ip地址所在的位置

返回的location变量是一个数组,包括:

复制代码 代码如下:
$location['ip'] // ip地址
$location['beginip'] // 用户ip所在范围的开始地址
$location['endip'] // 用户ip所在范围的结束地址
$location['country'] // 所在国家或者地区
$location['area'] // 所在区域

通常,我们要获取ip定位的话,只需要取country和area信息:

复制代码 代码如下:
$info =  $location['country'].$location['area'];

如果你使用的ip地址库文件不是utfwry.dat(注意在linux下面文件名的大小写也需要一致)的话,我们需要在实例化iplocation类的时候传入地址库文件名,例如:

复制代码 代码如下:
$ip = new iplocation('myipwry.dat'); // 传入ip地址库文件名

如果你的ip地址库是gbk编码的话,需要对返回结果进行编码转换。例如:

复制代码 代码如下:
$info = iconv('gbk','utf-8',$location['country'].$location['area']);

如果调用getlocation方法的时候没有传入任何参数,系统会自动调用上面的get_client_ip函数获取当前所在ip地址:

复制代码 代码如下:
$location = $ip->getlocation();

也可以支持传入域名来自动获取ip地址

复制代码 代码如下:
import('org.net.iplocation');// 导入iplocation类
$ip = new iplocation(); // 实例化类
$area = $ip->getlocation('www.thinkphp.cn'); // 获取域名服务器所在的位置
dump($area);

运行结果输出:

如果大家使用的是纯真ip地址库,或者经常需要变换不同的地址库,为了方便ip定位的查询,也可以单独封装一个函数来获取位置信息,参考这里: http://www.thinkphp.cn/code/88.html

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网