经常碰到需要根据客户IP获取城市的场景,这里记录一下
1.获取IP
function getip() {
static $ip = '';
$ip = $_SERVER['REMOTE_ADDR'];
if(isset($_SERVER['HTTP_CDN_SRC_IP'])) {
$ip = $_SERVER['HTTP_CDN_SRC_IP'];
}
elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
foreach ($matches[0] AS $xip) {
if (!preg_match('#^(10|172.16|192.168).#', $xip)) {
$ip = $xip;
break;
}
}
}
return $ip;
//原文链接:https://blog.csdn.net/JackChenjialin/article/details/128457316
}
2.ip所属城市
function ip_address($ip){
$ch = curl_init();
$url = 'https://whois.pconline.com.cn/ipJson.jsp?ip='.$ip;
//用curl发送接收数据
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//请求为https
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$location = curl_exec($ch);
curl_close($ch);
//转码
$location = mb_convert_encoding($location, 'utf-8','GB2312');
//var_dump($location);
//截取{}中的字符串
$location = substr($location, strlen('({')+strpos($location, '({'),(strlen($location) - strpos($location, '})'))*(-1));
//将截取的字符串$location中的‘,’替换成‘&’ 将字符串中的‘:‘替换成‘=’
return $location = str_replace('"',"",str_replace(":","=",str_replace(",","&",$location)));
//php内置函数,将处理成类似于url参数的格式的字符串 转换成数组
parse_str($location,$ip_location);
return $ip_location['addr'];
}
//
原文链接:https://blog.csdn.net/weixin_47736740/article/details/128725360
已经是我用的第三个方法了, 希望能坚持久一些