1. 程式人生 > >PHP 獲取 IP 地址所在的地理位置資訊/城市

PHP 獲取 IP 地址所在的地理位置資訊/城市

類似的部落格很多,五花八門,來個自己封裝的函式,只需呼叫淘寶網 API 介面,即可獲取公網或區域網所在的地理位置資訊。
直接上程式碼,很簡單。

/**
 * 根據 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; }

附錄:獲取 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];
}