插件窝 干货文章 案例:php利用淘宝IP库获取用户ip地理位置

案例:php利用淘宝IP库获取用户ip地理位置

ip getenv FORWARDED http 820    来源:    2025-05-18

使用PHP通过淘宝IP库获取用户地理位置

淘宝IP库提供了一个免费的IP地址查询接口,可以用来获取IP地址对应的地理位置信息。下面我将介绍如何在PHP中实现这一功能。

基本实现方法

<?php
/**
 * 通过淘宝IP库获取IP地理位置
 * @param string $ip IP地址,留空则自动获取客户端IP
 * @return array 返回地理位置信息数组
 */
function getLocationByIp($ip = '') {
    if (empty($ip)) {
        $ip = getClientIp();
    }

    $url = "http://ip.taobao.com/service/getIpInfo.php?ip=" . $ip;
    $response = file_get_contents($url);
    $data = json_decode($response, true);

    return $data;
}

/**
 * 获取客户端IP地址
 * @return string IP地址
 */
function getClientIp() {
    if (getenv('HTTP_CLIENT_IP')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif (getenv('HTTP_X_FORWARDED_FOR')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif (getenv('HTTP_X_FORWARDED')) {
        $ip = getenv('HTTP_X_FORWARDED');
    } elseif (getenv('HTTP_FORWARDED_FOR')) {
        $ip = getenv('HTTP_FORWARDED_FOR');
    } elseif (getenv('HTTP_FORWARDED')) {
        $ip = getenv('HTTP_FORWARDED');
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }

    return $ip;
}

// 使用示例
$ip = '8.8.8.8'; // 可以指定IP,留空则获取当前用户IP
$location = getLocationByIp($ip);

if ($location && $location['code'] == 0) {
    $info = $location['data'];
    echo "IP: " . $info['ip'] . "<br>";
    echo "国家: " . $info['country'] . "<br>";
    echo "地区: " . $info['area'] . "<br>";
    echo "省份: " . $info['region'] . "<br>";
    echo "城市: " . $info['city'] . "<br>";
    echo "运营商: " . $info['isp'] . "<br>";
} else {
    echo "获取地理位置失败: " . $location['data'];
}
?>

使用cURL的改进版本

对于需要更稳定请求的情况,可以使用cURL代替file_get_contents:

function getLocationByIp($ip = '') {
    if (empty($ip)) {
        $ip = getClientIp();
    }

    $url = "http://ip.taobao.com/service/getIpInfo.php?ip=" . $ip;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);

    return $data;
}

注意事项

  1. 频率限制:淘宝IP库有查询频率限制,不建议频繁调用,可以考虑缓存结果。

  2. HTTPS支持:淘宝IP库的HTTPS接口可能需要特殊处理或密钥。

  3. 备用方案:可以考虑其他IP库作为备用,如:

    • 纯真IP库
    • IPIP.net
    • 百度IP定位API
    • 高德IP定位API
  4. 本地IP库:对于高频率查询需求,建议使用本地IP库如IP2Region。

缓存优化示例

function getLocationByIpWithCache($ip = '', $cacheTime = 86400) {
    if (empty($ip)) {
        $ip = getClientIp();
    }

    $cacheFile = 'ip_cache/' . md5($ip) . '.json';

    // 检查缓存是否存在且未过期
    if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $cacheTime)) {
        return json_decode(file_get_contents($cacheFile), true);
    }

    // 从淘宝API获取数据
    $data = getLocationByIp($ip);

    // 保存到缓存
    if (!is_dir('ip_cache')) {
        mkdir('ip_cache', 0755, true);
    }
    file_put_contents($cacheFile, json_encode($data));

    return $data;
}

返回数据结构说明

成功时返回的JSON数据结构示例:

{
    "code": 0,
    "data": {
        "ip": "8.8.8.8",
        "country": "美国",
        "area": "",
        "region": "加利福尼亚",
        "city": "洛杉矶",
        "county": "",
        "isp": "谷歌公司",
        "country_id": "US",
        "area_id": "",
        "region_id": "US_107",
        "city_id": "US_1018",
        "county_id": "",
        "isp_id": "1000118"
    }
}

失败时返回的JSON数据结构示例:

{
    "code": 1,
    "data": "invaild ip."
}

通过这种方式,你可以轻松地在PHP应用中集成IP地理位置查询功能。