使用PHP获取IP地址的国家/地区

使用PHP获取IP地址的国家/地区,php,geolocation,ip-address,geoip,ip-geolocation,Php,Geolocation,Ip Address,Geoip,Ip Geolocation,理想情况下,我会尝试编写一个PHP脚本,可以从任何web浏览器查询,它会返回访问PHP脚本的IP地址所在的国家/地区 这是可能的还是有更好的解决方案?查看“其他基本扩展”下的GeoIP函数。有一些免费的、简单的API可以使用,比如: 还有很多其他的 哪个看起来最值得信赖取决于你:) 否则,存在基于服务器上本地数据库的脚本。不过,数据库数据需要定期更新。看看这个: 嗯 编辑: 当然,根据您的项目,您可能希望查看功能。你还不能在Internet Explorer上使用它们(IE9

理想情况下,我会尝试编写一个PHP脚本,可以从任何web浏览器查询,它会返回访问PHP脚本的IP地址所在的国家/地区


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

查看“其他基本扩展”下的GeoIP函数。

有一些免费的、简单的API可以使用,比如:

  • 还有很多其他的
哪个看起来最值得信赖取决于你:)

否则,存在基于服务器上本地数据库的脚本。不过,数据库数据需要定期更新。看看这个:

编辑: 当然,根据您的项目,您可能希望查看功能。你还不能在Internet Explorer上使用它们(IE9将支持它,还有很长的路要走),但如果你的受众主要是在移动设备上或使用Safari/Firefox,那么一定值得一看

一旦你有了坐标,你就可以把它们反译成国家代码。同样,还有这样的API:

  • 例如:
  • 更多API:
更新,2013年4月
今天,我推荐使用PHP库,它可以很容易地对ip地址和邮政地址数据进行地理编码

***更新,2016年9月

由于谷歌的隐私政策已经改变,如果你的服务器没有HTPPS证书或者用户不允许你检查他的位置,你就不能使用HTML5地理定位API。因此,现在您可以使用用户的IP并在PHP中签入或获取HTTPS证书。

您可以从MaxMind下载IP表:

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

使用小部件,也可以获取国家信息和最后一页信息。

有各种web API可以为您实现这一点。下面是一个使用我的服务的示例:


WebAPI是一个很好的快速简单的解决方案,但是如果你需要做大量的查找,那么在你自己的机器上有一个IP->country数据库是一个更好的解决方案。MaxMind提供了一个可以与各种PHP库一起使用的工具,包括。

我发现这篇博客文章非常有用。它救了我一天。

基本上,您需要安装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
}
下面是一个使用

  • 更多信息,请访问:

    • 这里是另一个用于地理定位请求的免费API:


      响应是JSON格式的。此外,如果您需要设置自己的API,可以在github上获得API源代码。

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

      我之所以推荐这一点,是因为根据我的经验,即使包括我的IP的城市和国家位置,它也工作得很好,而大多数其他数据库/API都没有包括/报告我的位置,除非它指向该数据库。
      (我的IP位置来自“伊朗”的“Rasht”城市)当我进行测试时,ip为:
      2.187.21.235
      等于
      45815275

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

      数据库:

      API服务:
      我知道有很多答案,但没有一个提到

      每小时最多允许您进行15000次查询。我认为在大多数情况下这已经足够了。否则,您应该考虑从中使用本地数据库

      Freegeoip是开源的,您可以在上查找源代码,在本地部署,并摆脱查询限制

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


      将为您获取国家/地区代码。

      您可以使用此选项从IP地址获取国家/地区

      代码

      回应

         US 
      
      这是一个例子。当您在此处查询特定字段(例如
      country
      )时,响应为
      text
      。无需解码,只需插入代码即可

      如果您需要所有字段,例如
      https://ipapi.co/8.8.8.8/json/
      ,响应为
      JSON

      如果可以,请安装并使用。关于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
      

      您可以尝试提供JSON或JSONP回调解决方案的服务

      • JSON:
      • JSONP:
      
      
      您可以使用获取国家名称、城市名称、纬度和经度。它支持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
      }
      
      我在运行该服务,您只需拨打一个简单的电话即可免费接入该服务:

      <?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);
      
      提供了一个可扩展的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
      
      免责声明


      我创建了这项服务。

      它们不是真正内置的。那么请更正。强制性说明:由于各种代理、VPN和其他恐怖因素,IP-to-location不是一种可靠的源识别方法。根据IP地址,我现在在德克萨斯、挪威、捷克共和国和日本。IPLocate.io提供免费API:-免责声明:我运行此服务。要获得快速可靠的解决方案,您应该尝试Ipregistry.co:(免责声明:我运行此服务)。此,这是一种从IP地址获取国家信息的极好方法。我不明白人们如何获取本地化的城市/国家名称,因为geolite只提供了几种语言。最令人惊讶的是,为“from”和“to”列添加索引使查询耗时延长了10倍。保持数据库未索引对我来说最有效,t
      <?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>";
      
      ?>
      
      $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
      }
      
      <?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);
      
      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