【问题标题】:How to track users location / region in PHP如何在 PHP 中跟踪用户位置/区域
【发布时间】:2011-04-25 07:03:01
【问题描述】:

我正在尝试获取用户浏览网站的国家/地区,以便确定在网站上显示的货币。我曾尝试使用来自:http://api.hostip.info 的 GET 脚本,但它们只是在我测试时返回 XX。

如果有人知道更好的方法,请分享。

谢谢。

【问题讨论】:

标签: php geolocation ip-address currency region


【解决方案1】:

我用这个:

  $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  $ip = $_SESSION['ip'];
  $try1 = "http://ipinfodb.com/ip_query.php?ip=".$ip."&output=xml";
  $try2 = "http://backup.ipinfodb.com/ip_query.php?ip=".$ip."&output=xml";
  $XML = @simplexml_load_file($try1,NULL,TRUE);
  if(!$XML) { $XML = @simplexml_load_file($try2,NULL,TRUE); }
  if(!$XML) { return false; }

  //Retrieve location, set time
  if($XML->City=="") { $loc = "Localhost / Unknown"; }
  else { $loc = $XML->City.", ".$XML->RegionName.", ".$XML->CountryName; }
  $_SESSION['loc'] = $loc;

【讨论】:

  • 这会在每次运行时发出请求(没有本地缓存​​已解析的 IP)。如果外部网站出现故障,页面加载需要 30 或 60 秒
  • 您所描述的需要离线缓存 IP,据我了解,这违背了练习的目的。
【解决方案2】:

试试这些:

http://ip-to-country.webhosting.info/

http://www.ip2location.com/

两者都是 IP 地址到国家/地区的数据库,可让您查找给定 IP 地址的来源国家/地区。

但请务必注意,这些数据库并非 100% 准确。它们是一个很好的指南,但由于各种原因,您会得到错误的结果。

  • 许多人使用代理来绕过特定国家/地区的屏蔽和过滤器。
  • 许多 IP 范围分配给地理分布较大的公司;你只会得到他们所在的国家,而不是实际机器所在的国家(这在跟踪 AOL 用户时一直是个大问题,因为他们显然都住在弗吉尼亚)
  • IP 范围的控制权有时会在国家/地区之间转移,因此您可能会因此得到错误的结果(尤其是对于较小/连接不太好的国家/地区)

使您的数据库保持最新将缓解其中一些问题,但不会完全解决它们(尤其是代理问题),因此您应该始终考虑到会得到错误结果的事实。

【讨论】:

    【解决方案3】:

    您应该使用geoip library

    Maxmind提供免费数据库和商业数据库,最后更新日期和精度不同,商业质量更好。

    免费数据库请参见http://www.maxmind.com/app/geolitecountry

    我认为它应该足以满足基本需求。

    【讨论】:

      【解决方案4】:

      您可以使用 Geolocation 获取坐标,然后使用一些 Service 从中获取 Country,但是 geolocation API 是基于浏览器的,因此您只能通过 JavaScript 访问它,然后必须以某种方式将这些信息传递给 PHP,我写道JS部分上的东西一次:

      http://www.lautr.com/utilizing-html5-geolocation-api-and-yahoo-placefinder-example

      当涉及到通过 IP 获取位置时,有大量的服务提供数据库,有些是免费的,有些是收费的,有些存储了很多 IP 和大量数据,有些存储了更少的数据,用于例如你提到的那个,工作得很好:

      http://api.hostip.info/?ip=192.0.32.10

      因此,您可以使用非常简洁的 Geolocation API,但需要用户许可,通过 JS 工作并且不能在 IE 中工作(到目前为止),或者必须寻找适合您需求的 IPÜ 定位服务 :)

      【讨论】:

        【解决方案5】:

        试试这些:

        $key="9dcde915a1a065fbaf14165f00fcc0461b8d0a6b43889614e8acdb8343e2cf15"; $ip="198.168.1230.122";

        $url = "http://api.ipinfodb.com/v3/ip-city/?key=$key&ip=$ip&format=xml";

        //加载xml文件

        $xml = simplexml_load_file($url); // 打印第一个元素的名字

        echo $xml->getName() 。 "
        "; // 创建一个循环来打印每个节点的元素名称和数据

        foreach($xml->children() as $child)

        {

        echo $child->getName() . ": " . $child . "<br />";
        

        }

        【讨论】:

          【解决方案6】:

          如前所述,有很多方法可以做到这一点。但我建议你看看我们开发的https://github.com/ip2iq/ip2-lib-php 提供的 IP2 PHP 库。

          你可以像下面这样使用它:

          <?php
              require_once("Ip2.php");
          
              $ip2 = new \ip2iq\Ip2();
              $country_code = $ip2->country('8.8.8.8');
              //$country_code === 'US'
          ?>
          

          它不需要任何 SQL 或 Web 服务查找,只需一个本地数据文件。它比几乎所有其他方法都快。该数据库每月更新一次,您可以免费下载。

          如果您需要您的语言中的国家/地区名称,您现在唯一需要做的就是将其映射到类似 https://gist.github.com/DHS/1340150 的关联数组

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-07-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-09
            • 2014-08-09
            相关资源
            最近更新 更多