我想从访问者的IP地址中检索他们的城市、州和国家等信息,这样我就可以根据他们的位置定制我的网页。在PHP中是否有一种好的、可靠的方法来做到这一点?我使用JavaScript作为客户端脚本,PHP作为服务器端脚本,MySQL作为数据库。


当前回答

使用谷歌api:

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>

其他回答

如果有人无意中发现了这个问题,这里有另一个解决方案。在timezoneapi。I . io你可以请求一个IP地址并返回几个对象(我已经创建了服务)。创建它是因为我需要知道我的用户在哪个时区,在世界的哪个地方,以及现在是什么时间。

在PHP中-返回位置,时区和日期/时间:

// Get IP address
$ip_address = getenv('HTTP_CLIENT_IP') ?: getenv('HTTP_X_FORWARDED_FOR') ?: getenv('HTTP_X_FORWARDED') ?: getenv('HTTP_FORWARDED_FOR') ?: getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR');

// Get JSON object
$jsondata = file_get_contents("http://timezoneapi.io/api/ip/?" . $ip_address);

// Decode
$data = json_decode($jsondata, true);

// Request OK?
if($data['meta']['code'] == '200'){

    // Example: Get the city parameter
    echo "City: " . $data['data']['city'] . "<br>";

    // Example: Get the users time
    echo "Time: " . $data['data']['datetime']['date_time_txt'] . "<br>";

}

使用jQuery:

// Get JSON object
$.getJSON('https://timezoneapi.io/api/ip', function(data){

    // Request OK?
    if(data.meta.code == '200'){

        // Log
        console.log(data);

        // Example: Get the city parameter
        var city = data.data.city;
        alert(city);

        // Example: Get the users time
        var time = data.data.datetime.date_time_txt;
        alert(time);

    }

});

PHP对此有一个扩展。

从PHP.net:

GeoIP扩展允许您查找IP地址的位置。 城市,州,国家,经度,纬度和其他信息为 所有的,如ISP和连接类型可以得到的帮助 GeoIP。

例如:

$record = geoip_record_by_name($ip);
echo $record['city'];

Ipdata。co是一个快速、高可用的IP地理定位API,性能可靠。

它具有极高的可扩展性,在世界各地有10个端点,每个端点每秒可以处理>万个请求!

这个答案使用了一个非常有限的“测试”API键,仅用于测试几个调用。注册您自己的免费API密钥,每天最多可获得1500个开发请求。

在php中

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->latitude;
37.751

下面是一个客户端示例,展示了如何获取国家、地区和城市;

$ . get (" https://api.ipdata.co?Api-key =test",函数(响应){ $(" #反应”). html (JSON。Stringify(响应,null, 4)); $("#country").html(' country: ' + response.country_name); $("#region").html(' region ' + response.region); $("#city").html(' city ' + response.city); }, " jsonp "); < script src = " https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js " > < /脚本> < div id = "国家" > < / div > < div id = "地区" > < / div > < div id = "城市" > < / div > < pre id =“响应”> < / >之前

免责声明;

我创建了这项服务。

有关多种语言的示例,请参阅文档

还可以查看最佳IP地理定位api的详细分析。

使用谷歌api:

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>

我喜欢Maxmind的免费GeoLite City,它最适用 如果它不够精确,你可以从它升级到付费版本。包括一个PHP API,以及其他语言的API。如果你将Lighttpd作为web服务器运行,你甚至可以使用一个模块为每个访问者获取SERVER变量中的信息,如果这是你所需要的。

我应该补充的是,还有一个免费的Geolite Country(如果你不需要确定IP来自哪个城市,这个会更快)和Geolite ASN(如果你想知道谁拥有IP),最后所有这些都可以在你自己的服务器上下载,每月更新一次,使用提供的api可以非常快地查找,因为他们说“每秒数千次查找”。