使用PHP获取IP地址

时间:2010-09-06 08:29:44

标签: php geolocation ip-address geoip ip-geolocation

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

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

17 个答案:

答案 0 :(得分:88)

您可以使用免费,简单的API,例如:

哪一个看起来最值得信赖取决于你:)

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

HTH!

修改 当然,根据您的项目,您可能希望查看HTML5 Location功能。您无法在Internet Explorer上使用它们(IE9将支持它,还有很长的路要走),但是如果您的受众主要是在移动设备上或使用Safari / Firefox,那么绝对值得一看!

获得坐标后,您可以将它们反向地理编码为国家/地区代码。还有像这样的API:

更新,2013年4月
今天我建议使用Geocoder,这是一个PHP库,可以很容易地对IP地址和邮政地址数据进行地理编码。

***更新,2016年9月
由于Google的隐私政策已发生变化,如果您的服务器没有HTPPS证书或用户不允许您检查其位置,则无法使用HTML5 Geolocation API。所以现在你可以使用用户的IP并在PHP中签入或获得HTTPS证书。

答案 1 :(得分:54)

有各种各样的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

答案 2 :(得分:25)

您可以从MaxMind下载ip-tables:

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
");

答案 3 :(得分:10)

以下是使用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;

答案 4 :(得分:6)

您可以使用此location API

从IP地址获取国家/地区

代码

    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

答案 5 :(得分:5)

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

答案 6 :(得分:5)

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

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

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

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

答案 7 :(得分:4)

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

会为您提供国家/地区代码。

答案 8 :(得分:2)

如果可以,请安装并使用PHP's GeoIP extension。关于debian lenny:

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

答案 9 :(得分:1)

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

<强>声明

我建立了这项服务。

答案 10 :(得分:1)

我在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对象将包含您的地理位置字段,例如countrycity等。

查看docs了解详情。

答案 11 :(得分: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
}

答案 12 :(得分:1)

如果您需要拥有一个良好且更新的数据库,为了获得更高的性能而不从您的网站请求外部服务here,您可以下载更新且准确的数据库。

我建议这样做,因为根据我的经验,它的工作非常出色,甚至包括我的IP的城市和国家/地区位置,大多数其他数据库/ apis未能包含/报告我的位置,除了this service指示我这个数据库。
(当我测试时,我的ip位置来自“伊朗”中的“Rasht”城市,而ip是:2.187.21.235等于45815275

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

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

API服务: http://ipinfodb.com/ip_location_api.php

答案 13 :(得分:1)

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

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

答案 14 :(得分: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
}

答案 15 :(得分: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>";

?>

答案 16 :(得分:0)

使用小工具www.feedsalive.com获取国家信息&amp;最后一页信息。