PHP 获取 IP 地址所在的地理位置信息/城市

源码:https://github.com/hacfins/thinkphp6-api/blob/master/app/common/third/MapService.php

类似的博客很多,五花八门,来个自己封装的函数,只需调用淘宝网 API 接口,即可获取公网或局域网所在的地理位置信息。
直接上代码,很简单。

1、方案一

http://ip.taobao.com/

/**
 * 根据 Ip 获取地址位置
 */
function getIpInfo($internetIp = '')
{
    try
    {
        //内网IP
        //  A类10.0.0.0~10.255.255.255
        //  B类172.16.0.0~172.31.255.255
        //  C类192.168.0.0~192.168.255.255
        //  ......
        $bLocalIp = !filter_var($internetIp, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
        if($bLocalIp)
            $internetIp = 'myip';//局域网IP
            
        $requestAPi = "http://ip.taobao.com/service/getIpInfo.php?ip=" . $internetIp;
        $opts       = array(
            'http' => array(
                'method'  => 'GET',
                'timeout' => 1, // 单位秒
            )
        );
        $jsonArr = json_decode( file_get_contents($requestAPi, false, stream_context_create($opts)),
            JSON_HEX_TAG | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_HEX_APOS );
            
        // 说明断网
        if (!isset($jsonArr) || !isset($jsonArr['code']))
        {
            return false;
        }
        
        // 0 表示成功
        if ($jsonArr['code'] !== 0)
        {
            return false;
        }
        
		// 返回的数据结果:
        //  "ip": "223.98.166.115",
        //  "country": "中国",
        //  "area": "",
        //  "region": "山东",
        //  "city": "济南",
        //  "county": "XX",
        //  "isp": "移动",
        //  "country_id": "CN",
        //  "area_id": "",
        //  "region_id": "370000",
        //  "city_id": "370100",
        //  "county_id": "xx",
        //  "isp_id": "100025"
        $data = (array)$jsonArr['data'];
        return $data;
    }
    catch (\Exception $e)
    {
    
    }
    
    return false;
}

淘宝网 API 接口有限制调用频率

2、方案二

http://ip-api.com/json/?lang=zh-CN
http://ip-api.com/json/115.191.200.34?lang=zh-CN

附录:获取 IP 地址

/**
 * 获取客户端IP地址
 * @param int $type [IP地址类型]
 * @param bool $strict [是否以严格模式获取]
 * @return mixed [客户端IP地址]
 */
function client_ip($type = 0, $strict = false)
{
    $ip = null;
    // 0 返回字段型地址(127.0.0.1)
    // 1 返回长整形地址(2130706433)
    $type = $type ? 1 : 0;
    if ($strict) {
        /* 防止IP地址伪装的严格模式 */
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $pos = array_search('unknown', $arr);
            if (false !== $pos) {
                unset($arr[$pos]);
            }
            $ip = trim(current($arr));
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
    } else if (isset($_SERVER['REMOTE_ADDR'])) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    /* IP地址合法性验证 */
    $long = sprintf("%u", ip2long($ip));
    $ip = $long ? [$ip, $long] : ['0.0.0.0', 0];
    return $ip[$type];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郎涯技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值