2010-09-06 97 views
76

理想情况下,我正在尝试将可从任何Web浏览器查询的PHP脚本放在一起,并返回访问PHP脚本的IP地址的国家/地区。使用PHP获取IP地址的国家

这是可能的还是有更好的解决方案?

+4

必须注意:由于各种代理,VPN和其他恐惧,IP到位置不是可靠的源识别方法。根据IP地址,我现在在德克萨斯州,挪威,捷克共和国和日本。 – Piskvor 2010-09-06 08:46:16

+0

结帐我的服务https://ipdata.co为此,它提供了一些数据点,包括国家,经纬度,城市,地区。 – Jonathan 2017-09-05 07:36:43

+0

IPLocate.io提供了一个免费的API:['https://www.iplocate.io/api/lookup/8.8.8.8'](https://www.iplocate.io/api/lookup/8.8.8.8) - 免责声明:我运行这项服务。 – ttarik 2017-11-15 00:29:03

回答

4

查看“其他基本扩展”下的GeoIP功能。 http://php.net/manual/en/book.geoip.php

+5

他们不*真的*内置。 http://www.php.net/manual/en/geoip.requirements.php – 2010-09-06 08:37:09

+0

我站好了。 – 2010-09-06 10:00:59

+4

然后修改它。 – 2016-10-06 16:57:52

82

有免费的,简单的API,您可以使用,像:

哪一个看上去最值得信赖的是你的:)

否则,有哪个是基于您的服务器上的本地数据库的脚本。但是,数据库数据需要定期更新。看看这个:

HTH!

编辑: 当然,根据您的项目,你可能想看看HTML5 Location功能。你不能在Internet Explorer上使用它们(IE9会支持它,还有很长的路要走),但是如果你的观众主要是在移动设备上或者使用Safari/Firefox,那么绝对值得一看!

一旦你有了坐标,你就可以将它们转换为一个国家代码的地理编码。再有API的像这样的:

更新,2013年4月
今天,我会建议使用Geocoder,一个PHP库,这使得地理编码IP地址以及邮政地址数据非常简单。

***更新,2016年9月
由于谷歌的隐私政治发生了变化,你不能使用HTML5地理位置API,如果你的服务器没有证书HTPPS或用户不允许你检查他的位置。因此,现在您可以使用用户的IP并使用PHP签入或获得HTTPS证书。

+0

我认为这个api发生了变化,因为答案已发布,我现在收到以下错误:“GoogleMaps提供程序不支持IP地址,只有街道地址。” – 2016-07-16 11:14:48

+0

https://ipdata.co属于该列表:) – Jonathan 2017-09-04 21:45:18

24

您可以从下载的MaxMind IP-表:

http://www.maxmind.com/app/geolite

导入CSV到你的数据库(确保创建ip_long_from + ip_long_to索引)。然后,你可以简单地做:

$iplong = ip2long($_SERVER['REMOTE_ADDR']); 

// should use mysqli with prepared statements etc, but just an example 
mysql_query(" 
    SELECT country 
    FROM ip_table 
    WHERE $iplong BETWEEN ip_long_from AND ip_long_to 
    LIMIT 1 
"); 
+1

这是从IP地址获取国家的绝佳方式。 – Devator 2012-05-21 08:35:42

+0

我不明白人们如何获得本地化的城市/国家/地区名称,因为geolite只提供几种语言 – user151496 2015-02-05 14:24:09

+0

最令人惊讶的是,为“from”和“to”列添加索引使查询花费了10倍的时间。保持数据库未编制索引对我来说效果最佳,并与LIMIT 1一起工作。也许是因为数据按CSV排序。去搞清楚。 – 2015-12-10 00:50:18

46

有各种各样的web API会为你做这件事。这里用我的服务,http://ipinfo.io是一个例子:

$ip = $_SERVER['REMOTE_ADDR']; 
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}")); 
echo $details->country; // -> "US" 

的Web API是一个很好的快速和简单的解决方案,但如果你需要做大量的查找然后有一个IP - >你自己的机器上的国家数据库是解决方案更好MaxMind提供了一个free database,您可以使用各种PHP库,包括GeoIP

+0

我不会在生产环境中实施ipinfo.io。我只是将脚本中的主要延迟固定在一个为IP细节调用ipinfo.io的函数上。确保彻底测试您的提供商的选择:) – Tiago 2014-04-20 15:50:21

+0

过去可能是这样的,但现在它们已在几个提供商和几个城市举办,以获得最大的可用性和响应能力 - https://twitter.com/ipinfoio/status/ 458100167439159296 – 2014-06-30 02:22:50

1

我发现这篇博文非常有帮助。它拯救了我的一天。 http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

基本上你需要安装IP数据库表,然后做IP位置的mysql查询。

<?php 
include 'config.php'; 
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) OR die(mysql_error()); 
mysql_select_db(DB_NAME) OR die(mysql_error()); 
$ip = $_SERVER['REMOTE_ADDR']; 
$long = sprintf('%u', ip2long($ip)); 
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`"; 
$result = mysql_query($sql) OR die(mysql_error()); 
$ip_detail = mysql_fetch_assoc($result); 
if($ip_detail){ 
    echo $ip_detail['country']."', '".$ip_detail['state']."', '".$ip_detail['city']; 
} 
else{ 
    //Something wrong with IP 
} 
+0

这是为什么被拒绝两次? – 2014-10-21 01:23:57

+0

嗯,我可以先解释一下,因为这是我的第一或第二篇文章,文字数量不够,所以主持人给这篇文章一个负面的点,但我不知道第二个。 – Webby 2014-11-01 05:29:17

1

这里是地理定位请求的另一个免费API: http://geoip.nekudo.com

回应采用JSON格式。此外,如果您需要设置自己的API,则可以在github上使用API​​源代码。

0

如果你需要有一个良好的和更新的数据库,对于具有更高的性能,而不是从你的网站请求外部服务,here没有下载更新的,准确的数据库的好地方。

我推荐这个,因为在我的经验这是工作出色的,甚至包括我的IP城市和国家的位置大多数其他数据库/ API的失败,包括/除外this service它指引我到这个数据库报告我的位置。
(我的IP位置从“拉什特”市“伊朗”是在我的测试和知识产权是:2.187.21.235等于45815275

因此,我建议使用这些服务,如果您不确定哪些服务比较准确:

数据库: http://lite.ip2location.com/databases

API服务: ​​

4

我看到有很多答案,但没有他们的人提到https://freegeoip.net/

你被允许高达15,000 queries per hour。我认为在大多数情况下这已经足够了。否则,您应该考虑使用来自MaxMind GeoIP的本地数据库。

Freegeoip是开源的,你可以在github找到源代码,在本地部署它并摆脱查询限制。

此外,服务提供纬度/经度/时区和其他有用的东西。

4
$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country")) 

会让你的国家代码。

5

您可以从IP地址获得国家,这location API

代码

echo file_get_contents('https://ipapi.co/8.8.8.8/country/'); 

响应

US 

这里有一个fiddle。当您查询特定字段时,响应是textcountry这里。无需解码,只需将其插入代码即可。

P.S.如果你想要所有的领域,例如https://ipapi.co/8.8.8.8/json/,回答是JSON

1

如果可以,请安装并使用PHP's GeoIP extension。在Debian伦尼:

sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz 
sudo gunzip GeoLiteCity.dat.gz 
sudo mkdir -v /usr/share/GeoIP 
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat 

sudo apt-get install php5-geoip 
# or sudo apt-get install php-geoip for PHP7 

,然后尝试在PHP:

$ip = $_SERVER['REMOTE_ADDR']; 
$country = geoip_country_name_by_name($ip); 
echo 'The current user is located in: ' . $country; 

回报:

The current user is located in: Cameroon 
0

您可以尝试的https://www.geoip-db.com的服务,他们提供了一个JSON或JSONP回调的解决方案。

<?php 

    $json = file_get_contents("https://www.geoip-db.com/json"); 
    $data = json_decode($json); 

    print $data->country_code . "<br>"; 
    print $data->country_name . "<br>"; 
    print $data->state . "<br>"; 
    print $data->city . "<br>"; 
    print $data->postal . "<br>"; 
    print $data->latitude . "<br>"; 
    print $data->longitude . "<br>"; 
    print $data->IPv4 . "<br>"; 

?> 
1

您可以使用https://ip-api.io/获得国家名,城市名,经度和纬度。它支持IPv6。

作为奖励,它会告诉IP地址是tor节点,公共代理还是垃圾邮件发送者。

PHP代码:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118')); 
var_dump($result); 

输出:

{ 
"ip": "64.30.228.118", 
"country_code": "US", 
"country_name": "United States", 
"region_code": "FL", 
"region_name": "Florida", 
"city": "Fort Lauderdale", 
"zip_code": "33309", 
"time_zone": "America/New_York", 
"latitude": 26.1882, 
"longitude": -80.1711, 
"metro_code": 528, 
"suspicious_factors": { 
"is_proxy": false, 
"is_tor_node": false, 
"is_spam": false, 
"is_suspicious": false 
} 
0

我在IPLocate.io运行的服务,你可以连接到免费使用一个简单的电话:

<?php 
$res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8'); 
$res = json_decode($res); 

echo $res->country; // United States 
echo $res->continent; // North America 
echo $res->latitude; // 37.751 
echo $res->longitude; // -97.822 

var_dump($res); 

$res对象将包含您的地理位置字段,如country,city

查看docs了解更多信息。

0

Ipdata.co提供了一个可扩展的API来做到这一点。拥有10个全球终端,每个终端每天能够处理大于800M的请求!

它还为您提供来自任何IPv4或IPv6地址的组织,货币,时区,调用代码,标志和Tor退出节点状态数据。

在PHP

php > $ip = '8.8.8.8'; 
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}")); 
php > echo $details->region; 
California 
php > echo $details->city; 
Mountain View 
php > echo $details->country_name; 
United States 
php > echo $details->location; 
37.405991,-122.078514 

免责声明

我建这个服务。