PHP方法获取IP所属省市

70 阅读1分钟

经常碰到需要根据客户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

已经是我用的第三个方法了, 希望能坚持久一些