【问题标题】:Geo Location based on IP Address - PHP [closed]基于 IP 地址的地理位置 - PHP [关闭]
【发布时间】:2011-12-07 16:39:56
【问题描述】:

我们正在寻找一种快速准确的方法来根据访问者的 IP 获取他们的位置。

我们已经尝试过 ipinfodb.com,但他们的 API 在进行 API 调用时使我们的网站严重滞后。

您还建议什么其他服务?

【问题讨论】:

标签: php geolocation geoip


【解决方案1】:

获取地理 IP 信息

请求地理 IP 服务器 (netip.de) 进行检查,返回 IP 所在的位置(主机、州、国家、城镇)。

<?php
       $ip='94.219.40.96';
       print_r(geoCheckIP($ip));
       //Array ( [domain] => dslb-094-219-040-096.pools.arcor-ip.net [country] => DE - Germany [state] => Hessen [town] => Erzhausen )

       //Get an array with geoip-infodata
       function geoCheckIP($ip)
       {
               //check, if the provided ip is valid
               if(!filter_var($ip, FILTER_VALIDATE_IP))
               {
                       throw new InvalidArgumentException("IP is not valid");
               }

               //contact ip-server
               $response=@file_get_contents('http://www.netip.de/search?query='.$ip);
               if (empty($response))
               {
                       throw new InvalidArgumentException("Error contacting Geo-IP-Server");
               }

               //Array containing all regex-patterns necessary to extract ip-geoinfo from page
               $patterns=array();
               $patterns["domain"] = '#Domain: (.*?)&nbsp;#i';
               $patterns["country"] = '#Country: (.*?)&nbsp;#i';
               $patterns["state"] = '#State/Region: (.*?)<br#i';
               $patterns["town"] = '#City: (.*?)<br#i';

               //Array where results will be stored
               $ipInfo=array();

               //check response from ipserver for above patterns
               foreach ($patterns as $key => $pattern)
               {
                       //store the result in array
                       $ipInfo[$key] = preg_match($pattern,$response,$value) && !empty($value[1]) ? $value[1] : 'not found';
               }

               return $ipInfo;
       }

?>

【讨论】:

  • 这很好,但我更喜欢数据库,因为我们的网站会收到数千个请求,并且每次页面加载都会发出地理 IP 请求。
  • @latox 我刚刚更新了我的问题,看看那个链接应该是你在 nomsayn 之后的内容吗?
  • @Latox - 如果您使用 API 调用的结果维护本地缓存,那么您只需为每个新 IP 地址支付 API 调用的开销。但是,只要您不需要最新的准确性,上述链接中的数据库似乎非常适合您的应用程序。
  • 嘿,您知道本网站的使用条款吗?例如每天/小时的最大查询,许可协议......我似乎无法在其页面中找到它..TIA:D
  • PHPANDSTUFF 上的那篇文章充满了虚假的 cmets,并且依赖于定期更新的数据库。一点用都没有。哪里有可以异步检索这些数据的通用 API?
【解决方案2】:

最好和最新的是 GeoplugginAPI,它是免费且没有限制的

http://geoplugin.com

【讨论】:

    【解决方案3】:

    试试这个http://ip.codehelper.io/

    这里是 PHP 代码。该代码将自动缓存您的请求,因此您的服务器不会发送多个请求。返回 IP 地址、国家、城市和更多信息。

    <?php
    // Required Libraries
    require_once("ip.codehelper.io.php");
    require_once("php_fast_cache.php");
    
    // New Class
    $_ip = new ip_codehelper();
    
    // Detect Real IP Address & Location
    $real_client_ip_address = $_ip->getRealIP();
    $visitor_location       = $_ip->getLocation($real_client_ip_address);
    
    // Output result
    echo $visitor_location['Country']."";
    echo "<pre>";
    print_r($visitor_location);
    

    【讨论】:

      【解决方案4】:

      Digital Element 是该领域的市场领导者,也是提供企业解决方案的领导者。他们提供了广泛的 API,包括 PHP,以访问他们的服务器,您可以在本地安装或通过 Web 服务访问。他们的数据质量很高,他们的解决方案的性能非常好。 MaxMind 也是另一个获得好评的选择。

      为了获得最佳准确性,您需要选择每周更新一次的服务或解决方案,因为这些内容在给定网络中可能会发生很大变化。成本将取决于更新频率、地理数据的粒度以及您想要的附加字段或数据库的数量。一些提供商提供语言、人口统计、公司和域名等等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 2020-04-16
        • 2013-12-10
        • 2010-09-29
        • 1970-01-01
        • 2013-11-09
        相关资源
        最近更新 更多