如何在 php 中进行 geoip 查找?

Posted

技术标签:

【中文标题】如何在 php 中进行 geoip 查找?【英文标题】:How to do a geoip lookup in php? 【发布时间】:2011-06-27 21:27:14 【问题描述】:

我看到的所有教程都指向了像geoip_record_by_name 这样的函数。我总是收到这个错误:Fatal error: Call to undefined function geoip_record_by_name() in /home/<acct>/public_html/geoip.php on line <line>

我在“共享”主机上,这意味着我无权安装 PECL geoip 扩展。

还有哪些其他(免费!)方法可以执行 geoip 查找?最好是不依赖外部服务的?

【问题讨论】:

有一些服务可以让您下载 csv 格式的粗粒度数据库,从而将 IPS 降到***别。但否则你会被外部服务困住。如果提供者的 API 不是太糟糕,您可能可以通过一些 CURL 调用重新创建 geoip_*() 函数。 这些服务如何确定您的 IP 地址在哪里?他们如何获得开始的位置?我怎样才能生成自己的数据库? 既然有免费的 API 可以为您提供数据库,为什么还要创建自己的数据库?从头开始创建自己的数据库需要一个人几年的时间。 @imoda 它们是如何生成的? @Cyclone 我不知道具体情况。我认为这是一个非常细致的过程。 【参考方案1】:

如果您有 mysql 服务器,可以免费使用和安装 IP 数据库,然后执行 $_SERVER['REMOTE_ADDR'] 并针对数据库数据运行它。

即(基于一些任意的数据库)

<?php

    $result = mysql_query("SELECT *
                          FROM ips
                          WHERE ip = $_SERVER['REMOTE_ADDR']
                          LIMIT 1") or die(mysql_error());

    $row = mysql_fetch_assoc($result);

    $city = $row['city'];
    $state = $row['state'];
    $country = $row['country'];

?>

一些数据库(或者只是google它):http://www.ipinfodb.com/ip_database.php

编辑

您还可以从其他 API 发出 JSON/XML 请求并解析数据:

即(再次使用 ipinfodb.com)

$doc->loadXML(file_get_contents("http://api.ipinfodb.com/v2/ip_query.php?key=your_key&ip=" . $_SERVER['REMOTE_ADDR'] . "&timezone=false")); 

$country = $doc->getElementsByTagName('CountryName')->item(0)->nodeValue;

【讨论】:

有没有办法自己生成数据库? 对您的原始问题发表评论。当然,您可以创建自己的数据库,但没有真正快速简便的方法。【参考方案2】:

您可以尝试 hostip.info、Maxmind 或 ip2location 等等。这些很容易与 PHP 一起使用,并且可以用于共享主机。其中一些还有离线选项。

【讨论】:

第一个和最后一个相差了 50 英里,Maxmind 离得更近了一点,但不是很多...... @Cyclone:一分钱一分货。

以上是关于如何在 php 中进行 geoip 查找?的主要内容,如果未能解决你的问题,请参考以下文章

如何在共享服务器上配置 GeoIP?

GeoIP 查找——选项和数据持久性

nginx 和 PHP GeoIP 模块的内部错误 500

如何检查安装在我的服务器中的 GEOIP 模块

MaxMind GeoIP API:fseek() [function.fseek]:流不支持在 geoip.inc 中查找

如何使用php获取域的托管IP和国家名称