通过Maxmind GeoLite2 Free获取用户城市的本地化名称

时间:2014-01-10 10:11:13

标签: localization geoip maxmind

我想显示用户城市的德语名称。是否有可能免费版Maxmind Geoip? 我找不到打开GeoLite2-City.mmdb或GeoLiteCity.dat的方法,以查看列出的城市,以构建我自己的翻译服务。我该怎么打开它们?

3 个答案:

答案 0 :(得分:8)

以下是没有Composer的方法。

变化:

require_once '../vendor/autoload.php';
use MaxMind\Db\Reader;
$reader = new Reader('GeoIP2-City.mmdb');

要:

require_once __DIR__ . '/' . 'Db/Reader.php';
require_once __DIR__ . '/' . 'Db/Reader/Decoder.php';
require_once __DIR__ . '/' . 'Db/Reader/InvalidDatabaseException.php';
require_once __DIR__ . '/' . 'Db/Reader/Metadata.php';
require_once __DIR__ . '/' . 'Db/Reader/Util.php';     // new 2014/09
use MaxMind\Db\Reader;
$mmdb= true ? 'GeoLite2-City.mmdb' : 'GeoLite2-Country.mmdb';
$reader = new Reader( __DIR__  . '/' . $mmdb );

你需要PHP 5.3+。与使用Composer相比,您甚至可以节省一些代码和文件数量。 (删除了一些测试代码,以及整个Guzzle结构。)此外,它更清楚地说明了命名空间在PHP中如何作为类的一个很好的替代(当类只用于名称间距时)。

benchmark.php的剩余部分,您可以放弃并开始使用$reader->get()

如果你想要进行基准测试,那么在大多数平台上你需要修改rand()调用。试试这个:

变化:

$ip = long2ip(rand(0, pow(2, 32) -1));

要:

$n= (float)mt_rand(0, pow(2, 31) - 1);
if (mt_rand(0,1)) $n+= pow(2, 31);
$ip = long2ip($n);

或者只使用'。'加入四个mt_rand(0,255),这可能更容易!

........................ 修改2014/09 ........................

在上面添加了'Db / Reader / Util.php'。

MaxMind-DB-Reader-php版本:1.0.0(2014-09-22)

您的文件结构应如下所示:

./benchmark.php
./GeoLite2-City.mmdb
./GeoLite2-Country.mmdb
./Db/Reader.php
./Db/Reader/Decoder.php
./Db/Reader/InvalidDatabaseException.php
./Db/Reader/Metadata.php
./Db/Reader/Util.php

答案 1 :(得分:2)

GeoIP Legacy数据库不包含本地化名称,但GeoIP2(或GeoLite2)数据库也包含本地化名称。您可以按如下方式访问本地化名称:

<?php
require_once 'vendor/autoload.php';
use GeoIp2\Database\Reader;

$reader = new Reader('/usr/local/share/GeoIP/GeoLite2-City.mmdb');

$record = $reader->city('128.101.101.101');

print($record->country->names['de'] . "\n");

或者,如果您希望读者默认使用德语并在不可用时再使用英语,则可以在构造函数中设置语言:

<?php
require_once 'vendor/autoload.php';
use GeoIp2\Database\Reader;

$reader = new Reader('/usr/local/share/GeoIP/GeoLite2-City.mmdb', array('de', 'en'));

$record = $reader->city('128.101.101.101');

print($record->country->name . "\n");

答案 2 :(得分:0)

如果您对performance感到担忧,我建议您使用PHP Extension API。使用PHP(C API)扩展,您每秒可以获得超过700万次查询。

我将介绍如何编译扩展,以及如何在PHP中使用mmdb数据库来获取本地化的城市名称:

Intro to Maxmind GeoLite2 with Kohana PHP

Geolocate IP Address