PHP开发必备:深入了解获取访问者IP地址及IP归属地的知识
[id_2120078833]id_1548433345]

一、什么是IP地址
互联网协议(IP协议)定义了一种地址,用于标识网络上的主机(计算机或其他设备),这种地址就是IP地址。它是一个标识符,由四个数字组成。每个数字的范围是0到255,且以点分隔开。IP地址用于在互联网上进行通信以及传输数据,它类似于人类使用的邮政地址。它能够用来明确一个设备于网络里的位置,从而让其他设备可以精准地向该设备发送数据。IP地址分成IPv4和IPv6两个版本。IPv4是当前被广泛运用的版本,采用32位地址格式。IPv6是较新的版本,采用128位地址格式,是为了应对互联网用户数量的增长而设计的。
我们常用的IP4地址有8.8.8.8,114.114.114.114等,这些是类似由4组数字组成的网络地址。本地IP地址有192.168.0.1,127.0.0.1等。
二、PHP如何获取IP地址
PHP直接获取访问者IP地址:
$ip=$_SERVER["REMOTE_ADDR"];//访问者IP
在这里,我们能够借助系统变量$_SERVER["REMOTE_ADDR"]获取访问者的IP地址,接着将其存入自定义变量$ip。这样做便于后续代码进行引用。当然,此处是利用PHP直接获取用户的IP地址。倘若用户使用了代理服务器,那么这个IP地址便是代理服务器的IP地址,而不是用户的真实IP地址。
若要获取用户的真实IP地址,可尝试使用$_SERVER['HTTP_X_FORWARDED_FOR']。然而,并非所有代理服务器都会设置此值,故而结果可能为空或者不准确。若需准确获取用户的真实IP地址,可使用一些第三方的库或服务。
三、获取IP地址的归属地
我们不能借助PHP直接获取IP地址的归属地,不过我们能够利用本地IP库(离线下载)或者在线IP库来对IP地址做匹配,要是该IP地址在IP库中,或者对该IP特征进行匹配,便能够获得归属地。
1、百度在线API接查询
$ip=[id_1052911800]["REMOTE_ADDR"];$ak='**********';//这里需要你自己申请并获取$ipurl=https://api.map.baidu.com/location/ip?ak= (此内容似乎只是一个网址链接,未明确完整语义,仅按要求改写呈现).$ak.'&ip='.$ip[id_1926048095]$fh= file_get_contents("$ipurl");$jsonarr = json_decode($fh, true);if($jsonarr['status'] == 0){$result = $jsonarr['content'];$result = $result['address_detail'];$froms='中国-'.$result['province'].'-'.$result['city'];}else{echo "未能查询到".$ip."的归属地";}这里是借助百度api的IP查询接口来开展查询工作的。网络上有不少代码是通过淘宝IP库进行查询的,然而我发觉淘宝IP库的api接口似乎已经关闭了,无法正常使用了。
2、通过其他api接口查询
$token = '*******'; // 用户token ,登录系统后可获取到$fh= file_get_contents("https://67ip.cn/check?ip=$ip&token=$token");$jsonarr = json_decode($fh, true);;if($jsonarr['code']=='200'){$result = $jsonarr['data'];if($result['city']=='0'){$result['city']='未知';}if($result['service']=='0'){$result['service']='';}$froms=$result['country'].'-'.$result['city'].'-'.$result['service'];}else{$froms='火星';}本文介绍的查询方式都是通过api接口进行的,那为什么不介绍通过本地IP库进行查询呢,主要原因是本人没能获取到本地IP库的数据文件,并且不知道本地IP库的格式,所以无法完成有效的对应代码,如果谁有本地IP库能分享给我一份,那就太感谢了,不过我们可以举个例子来完成。
3、本地IP库获取归属地
假设我本地IP库的地址数据内容如下:
文件名称:ip.txt192.168.0.1:路由器192.168.0.2:老婆的电脑192.168.0.3:儿子的ipad192.168.0.4:老妈的手机192.168.0.5:老爹的手机118.118.118.188:本人的办公电脑...我们可以通过IP匹配的方法获得访问者信息:
$visitorIp = $_SERVER['REMOTE_ADDR'];$ipDataFile = 'ip.txt';// 读取ip.txt文件中的数据将变量$ipDataFile的内容读取到变量$ipData中 。// 按行拆分数据$ipRecords = explode("\n", $ipData);// 遍历IP记录,查找匹配的访问者信息foreach ($ipRecords as $record) {$parts = explode(":", $record);$ip = trim($parts[0]);$info = trim($parts[1]);// 匹配IP地址if ($visitorIp === $ip) {echo "访问者IP:".$visitorIp."
";echo "访问者信息:".$info;break;}}教程比较粗糙,有错误的地方欢迎指正!