回答
查看“其他基本扩展”下的GeoIP功能。 http://php.net/manual/en/book.geoip.php
他们不*真的*内置。 http://www.php.net/manual/en/geoip.requirements.php – 2010-09-06 08:37:09
我站好了。 – 2010-09-06 10:00:59
然后修改它。 – 2016-10-06 16:57:52
有免费的,简单的API,您可以使用,像:
- http://ipinfodb.com/ip_location_api.php
- http://www.ipgeo.com/api/
- http://ip2.cc/
- http://www.geobytes.com/IpLocator.htm
- https://iplocate.io/
- 和其他很多。
哪一个看上去最值得信赖的是你的:)
否则,有哪个是基于您的服务器上的本地数据库的脚本。但是,数据库数据需要定期更新。看看这个:
HTH!
编辑: 当然,根据您的项目,你可能想看看HTML5 Location功能。你不能在Internet Explorer上使用它们(IE9会支持它,还有很长的路要走),但是如果你的观众主要是在移动设备上或者使用Safari/Firefox,那么绝对值得一看!
一旦你有了坐标,你就可以将它们转换为一个国家代码的地理编码。再有API的像这样的:
- 例子:http://ws.geonames.org/countryCode?lat=47.03&lng=10.2
- 更多的API:http://www.geonames.org/export/ws-overview.html
更新,2013年4月
今天,我会建议使用Geocoder,一个PHP库,这使得地理编码IP地址以及邮政地址数据非常简单。
***更新,2016年9月
由于谷歌的隐私政治发生了变化,你不能使用HTML5地理位置API,如果你的服务器没有证书HTPPS或用户不允许你检查他的位置。因此,现在您可以使用用户的IP并使用PHP签入或获得HTTPS证书。
我认为这个api发生了变化,因为答案已发布,我现在收到以下错误:“GoogleMaps提供程序不支持IP地址,只有街道地址。” – 2016-07-16 11:14:48
https://ipdata.co属于该列表:) – Jonathan 2017-09-04 21:45:18
您可以从下载的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
");
这是从IP地址获取国家的绝佳方式。 – Devator 2012-05-21 08:35:42
我不明白人们如何获得本地化的城市/国家/地区名称,因为geolite只提供几种语言 – user151496 2015-02-05 14:24:09
最令人惊讶的是,为“from”和“to”列添加索引使查询花费了10倍的时间。保持数据库未编制索引对我来说效果最佳,并与LIMIT 1一起工作。也许是因为数据按CSV排序。去搞清楚。 – 2015-12-10 00:50:18
使用控件www.feedsalive.com,获得国家信息&最后一页的信息也是如此。
有各种各样的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。
我不会在生产环境中实施ipinfo.io。我只是将脚本中的主要延迟固定在一个为IP细节调用ipinfo.io的函数上。确保彻底测试您的提供商的选择:) – Tiago 2014-04-20 15:50:21
过去可能是这样的,但现在它们已在几个提供商和几个城市举办,以获得最大的可用性和响应能力 - https://twitter.com/ipinfoio/status/ 458100167439159296 – 2014-06-30 02:22:50
我发现这篇博文非常有帮助。它拯救了我的一天。 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
}
这是为什么被拒绝两次? – 2014-10-21 01:23:57
嗯,我可以先解释一下,因为这是我的第一或第二篇文章,文字数量不够,所以主持人给这篇文章一个负面的点,但我不知道第二个。 – Webby 2014-11-01 05:29:17
下面是使用http://www.geoplugin.net/json.gp
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}"));
echo $details;
这里是地理定位请求的另一个免费API: http://geoip.nekudo.com
回应采用JSON格式。此外,如果您需要设置自己的API,则可以在github上使用API源代码。
如果你需要有一个良好的和更新的数据库,对于具有更高的性能,而不是从你的网站请求外部服务,here没有下载更新的,准确的数据库的好地方。
我推荐这个,因为在我的经验这是工作出色的,甚至包括我的IP城市和国家的位置大多数其他数据库/ API的失败,包括/除外this service它指引我到这个数据库报告我的位置。
(我的IP位置从“拉什特”市“伊朗”是在我的测试和知识产权是:2.187.21.235
等于45815275
)
因此,我建议使用这些服务,如果您不确定哪些服务比较准确:
数据库: http://lite.ip2location.com/databases
API服务:
我看到有很多答案,但没有他们的人提到https://freegeoip.net/
你被允许高达15,000 queries per hour
。我认为在大多数情况下这已经足够了。否则,您应该考虑使用来自MaxMind GeoIP的本地数据库。
Freegeoip是开源的,你可以在github找到源代码,在本地部署它并摆脱查询限制。
此外,服务提供纬度/经度/时区和其他有用的东西。
$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country"))
会让你的国家代码。
您可以从IP地址获得国家,这location API
代码
echo file_get_contents('https://ipapi.co/8.8.8.8/country/');
响应
US
这里有一个fiddle。当您查询特定字段时,响应是text
country
这里。无需解码,只需将其插入代码即可。
P.S.如果你想要所有的领域,例如https://ipapi.co/8.8.8.8/json/
,回答是JSON
。
如果可以,请安装并使用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
您可以尝试的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>";
?>
您可以使用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
}
我在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了解更多信息。
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
免责声明
我建这个服务。
- 1. 使用whois从perl中获取IP地址的国家
- 2. 在java中使用ip地址获取国家名称
- 3. Python包:获取基于地址的国家(非ip)
- 4. 使用PHP file_get_contents获取IP地址
- 5. 与国家关联IP地址
- 6. SQL IP地址到国家代码
- 7. 按IP地址查找国家
- 8. 使用原生PHP获取IP的国家位置
- 9. 如何用页面中的IP地址替换IP地址中的IP地址(例如“国家,地区,城市”)
- 10. 从CSV文件中获取所有IP地址的国家/地区名称
- 11. Magento的 - 产品通过国家使用名称IP地址
- 12. 如何获取国家/地区列表IP地址范围从WHOIS服务器?
- 13. 如何通过IP地址获取国家/地区名称和/或代码?
- 14. 代码找到状态,国家,城市从IP地址在PHP
- 15. 使用Boost.Asio获取本地IP地址
- 16. 获取IP地址
- 17. 获取IP地址
- 18. 获取IP地址
- 19. 获取IP地址的ISP与PHP
- 20. 地址按国家/地区
- 21. IP对国家在PHP
- 22. 每个国家/地区计算不同的IP地址
- 23. 获取本地IP地址
- 24. 如何通过IP地址获取国家代码和货币代码?
- 25. 获取使用PHP的用户的IP地址
- 26. 如何使用php获取本地ip地址?
- 27. PHP API获取请求者IP地址
- 28. 获取ip地址的值
- 29. 获取我的IP地址
- 30. Django:使用信号获取IP地址
必须注意:由于各种代理,VPN和其他恐惧,IP到位置不是可靠的源识别方法。根据IP地址,我现在在德克萨斯州,挪威,捷克共和国和日本。 – Piskvor 2010-09-06 08:46:16
结帐我的服务https://ipdata.co为此,它提供了一些数据点,包括国家,经纬度,城市,地区。 – Jonathan 2017-09-05 07:36:43
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