GEOIP和获取计算机IP地址位置?

4
我希望我的网站能够定位访问者的位置,比如如果有人从伦敦或曼彻斯特等地方访问我的网站,我希望根据他们的电脑位置显示那些区域的用户。有点像在线约会网站推荐附近的用户。
我一直在研究这个 GEOIP 数据库,它列出了世界各地的所有城市。但我不知道下一步该怎么做?我需要查看获取 IP 地址的脚本,然后将其与 GEOip 数据库中的信息进行比较吗?
请有经验的人指点一下应该怎么做。谢谢。
GeoIP 数据库来源: http://dev.maxmind.com/geoip/geolite
7个回答

4

尝试下面的代码。

$ip =  $_SERVER['REMOTE_ADDR'];
echo $location = file_get_contents("http://api.hostip.info/country.php?ip=$ip");

不要在本地主机上尝试此操作。这将返回IP地址127.0.0.1。
echo $location= file_get_contents("http://api.hostip.info/country.php?ip=12.215.42.19");
//outputs US

4

PHP内置了GeoIP函数库。

GeoIP库

其中一个特别有用的函数会返回一个包含大陆、国家、城市等信息的数组。

geoip_record_by_name

使用$_SERVER['REMOTE_ADDR']作为您的IP地址。

$record = geoip_record_by_name($_SERVER['REMOTE_ADDR']);


4

这取决于您的需求。我建议您使用Web服务,这样您就不需要担心托管数据库和自己维护数据库了。您只需要解析访问者的IP地址并立即获取结果即可。我正在使用来自此网站的IP2location网络服务。


嗨,HexaHow - 我在你的帖子中做了一些更改。你已经找到格式化答案(例如添加链接)的帮助了吗? - Lars

1
请注意,此数据库为:在我们最近的测试中,GeoIP数据库在国家级别上的准确率达到了99.8%,在美国州级别上的准确率达到了90%,在美国40公里半径内的城市准确率为83%。

我建议您考虑使用PEAR GeoLite库

以下是在php中使用此库的快速代码片段:

$geoip = Net_GeoIP::getInstance(dirname(__FILE__) . '/data/GeoLiteCity.dat');
$ipaddress = '72.30.2.43'; // Yahoo!
$location = $geoip->lookupLocation($ipaddress);
var_dump($location);

输出将显示类似于:
object(Net_GeoIP_Location)[2]
    protected 'aData' =>
        array
        'countryCode' => string 'US' (length=2)
        'countryCode3' => string 'USA' (length=3)
        'countryName' => string 'United States' (length=13)
        'region' => string 'CA' (length=2)
        'city' => string 'Sunnyvale' (length=9)
        'postalCode' => string '94089' (length=5)
        'latitude' => float 37.4249
        'longitude' => float -122.0074
        'areaCode' => int 408
        'dmaCode' => float 807

1

0

你可能已经安装了GEOIP作为PECL扩展。如果没有,你可以自己安装它。

如果你需要比国家更具体的信息,那么你就需要付费获取数据库,但相关函数仍然可用。


0
你可以使用 https://geoip-db.com 的服务。以下是一个返回指定 IP 地址位置的 PHP JSONP 示例。
<?php

    $json = file_get_contents('https://geoip-db.com/jsonp/82.196.6.158');
    $data = jsonp_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>';

    function jsonp_decode($jsonp, $assoc = false) {
        if($jsonp[0] !== '[' && $jsonp[0] !== '{') {
            $jsonp = substr($jsonp, strpos($jsonp, '('));
        }
        return json_decode(trim($jsonp,'();'), $assoc);
    }
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接