2014-01-10 157 views
1

我想顯示用戶城市的德語名稱。 Maxmind Geoip的免費版本有可能嗎? 我沒有找到一種方法來打開GeoLite2-City.mmdb或GeoLiteCity.dat,查看列出哪些城市,以建立我自己的翻譯服務。我怎麼打開它們?通過Maxmind GeoLite2獲取用戶城市的本地化名稱免費

+0

該數據庫包括德國的城市名稱。你在使用什麼API? –

+0

使用.dat文件的PHP API – morritza

回答

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"); 
+0

構造函數不接受回退數組,但它起作用。你有沒有作曲家的例子? – morritza

+0

第二個示例適用於Composer的最新版本。我修正了一個未封閉的報價。 –

+0

就一個沒有Composer的例子而言,儘管這是可能的,但您可能最好使用一些PSR-0自動加載器。您還需要安裝MaxMind DB API。 –

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); 

還是剛剛加入4 mt_rand(0,255)的用',這可能是更容易!

........................ 編輯2014/09 .............. ..........

在上面添加了'Db/Reader/Util.php'。的MaxMind-DB-讀者的PHP的

版本:1.0.0(2014年9月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 
+0

Kitchin很高興能找到你的文章,並提供有關如何在沒有作曲家的情況下使用GeoLite2的指導。我按照您的指示設置了文件夾結構設置,並且更新了benchmark.php中的代碼,完全如您所述......但是當我運行該腳本時屏幕上沒有任何顯示,並且我的服務器錯誤日誌文件顯示如下:PHP致命錯誤:在238行的/SERVERPATH/foo/Db/Reader.php中找不到類'MaxMind \ Db \ Reader \ Util'(*其中SERVERPATH是服務器根的完整路徑)。任何想法爲什麼這不適合我?任何幫助將非常感謝!謝謝! – Mark

+1

馬克,我更新了我的帖子。 MaxMind添加了一個文件'Util.php'。 – kitchin

+1

太棒了,謝謝Kitchin修復了我的錯誤。還有一個(愚蠢的)問題......我怎麼才能讓它迴歸基於IP的國家?在$ reader = new Reader ...行之後,我有$ place = $ reader-> country('##。###。##。###'); (其中的#是實際的IP地址號碼)並且不起作用。我嘗試用'城市'代替'國家',但這也沒有奏效......我確定它很簡單,我只是不確定我需要使用哪些參數來讓國家返回。謝謝! – Mark

0

我會建議使用PHP擴展如果您對performance感興趣,請聯繫API。您可以使用PHP(C API)擴展每秒獲得700萬次查詢。

我描述瞭如何編譯擴展,以及如何使用內存數據庫的數據庫在PHP這裏得到本地化的城市名稱:

Intro to Maxmind GeoLite2 with Kohana PHP

Geolocate IP Address

相關問題