PHP 獲取 IP 地址所在的地理位置資訊/城市
阿新 • • 發佈:2019-01-30
類似的部落格很多,五花八門,來個自己封裝的函式,只需呼叫淘寶網 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];
}