我想显示用户城市的德语名称。Maxmind Geoip 的免费版本是否可行?我没有找到打开 GeoLite2-City.mmdb 或 GeoLiteCity.dat 以查看列出哪些城市的方法,以构建我自己的翻译服务。我怎样才能打开它们?
3 回答
这是没有 Composer 的方法。
- 在此处下载 zip DB-Reader: https ://github.com/maxmind/MaxMind-DB-Reader-php
- 在此处下载数据文件(城市或国家/地区):http ://dev.maxmind.com/geoip/geoip2/geolite2/
- 解压缩数据文件并将它们放在一个新目录中,
foo
. - 在 DB-Reader 中,复制
examples/benchmark.php
到foo/benchmark.php
. - 在 DB-Reader 中,复制
src/MaxMind/Db
到foo/Db
. - 编辑
foo/benchmark.php
.
改变:
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
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");
如果您完全关心性能,我建议您使用 PHP 扩展 API 。使用 PHP (C API) 扩展,您每秒可以获得超过 700 万次查询。
我在这里描述了如何编译扩展,以及如何使用 PHP 中的 mmdb 数据库来获取本地化的城市名称: