我想顯示用戶城市的德語名稱。 Maxmind Geoip的免費版本有可能嗎? 我沒有找到一種方法來打開GeoLite2-City.mmdb或GeoLiteCity.dat,查看列出哪些城市,以建立我自己的翻譯服務。我怎麼打開它們?通過Maxmind GeoLite2獲取用戶城市的本地化名稱免費
回答
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");
構造函數不接受回退數組,但它起作用。你有沒有作曲家的例子? – morritza
第二個示例適用於Composer的最新版本。我修正了一個未封閉的報價。 –
就一個沒有Composer的例子而言,儘管這是可能的,但您可能最好使用一些PSR-0自動加載器。您還需要安裝MaxMind DB API。 –
下面介紹如何在沒有Composer的情況下做到這一點。
- 這裏下載zip DB-讀者: 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);
還是剛剛加入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
Kitchin很高興能找到你的文章,並提供有關如何在沒有作曲家的情況下使用GeoLite2的指導。我按照您的指示設置了文件夾結構設置,並且更新了benchmark.php中的代碼,完全如您所述......但是當我運行該腳本時屏幕上沒有任何顯示,並且我的服務器錯誤日誌文件顯示如下:PHP致命錯誤:在238行的/SERVERPATH/foo/Db/Reader.php中找不到類'MaxMind \ Db \ Reader \ Util'(*其中SERVERPATH是服務器根的完整路徑)。任何想法爲什麼這不適合我?任何幫助將非常感謝!謝謝! – Mark
馬克,我更新了我的帖子。 MaxMind添加了一個文件'Util.php'。 – kitchin
太棒了,謝謝Kitchin修復了我的錯誤。還有一個(愚蠢的)問題......我怎麼才能讓它迴歸基於IP的國家?在$ reader = new Reader ...行之後,我有$ place = $ reader-> country('##。###。##。###'); (其中的#是實際的IP地址號碼)並且不起作用。我嘗試用'城市'代替'國家',但這也沒有奏效......我確定它很簡單,我只是不確定我需要使用哪些參數來讓國家返回。謝謝! – Mark
我會建議使用PHP擴展如果您對performance感興趣,請聯繫API。您可以使用PHP(C API)擴展每秒獲得700萬次查詢。
我描述瞭如何編譯擴展,以及如何使用內存數據庫的數據庫在PHP這裏得到本地化的城市名稱:
- 1. 導入MaxMind GeoLite2城市
- 2. 通過正則表達式從地址獲取城市名稱
- 3. 如何從MaxMind的GeoLite2城市本地mmdb和關聯的Java API獲取電話區號?
- 4. 如何通過Facebook的城市ID查找城市名稱?
- 5. 可靠的城市級地理IP,免費的本地數據庫
- 6. 從城市名稱獲取WOEID?
- 7. 如何獲得時區名稱的本地化城市和國家名稱
- 8. 查詢Maxmind GeoLite2城市在SQL Server中阻止csv以獲取IPv6和IPv4地址的geoname_id
- 9. Swift通過名稱獲取城市座標
- 10. 從經緯度獲取城市名稱
- 11. SQL服務器:通過城市名稱
- 12. maxmind GeoLite2-City accuracy_radius
- 13. 如何根據java中的IP地址獲取城市名稱?
- 14. 從GPS座標獲取城市名稱
- 15. 從城市名稱獲取經緯度
- 16. 從CLLocationManager獲取城市名稱?
- 17. 谷歌地圖獲取有城市名稱的經緯度?
- 18. 如何在谷歌地圖上通過IP獲取城市名稱?
- 19. 獲取地理位置的城市名稱
- 20. 獲取客戶端IP,然後從它的城市名稱
- 21. 獲取城市名稱谷歌地圖路線經歷
- 22. 獲取城市名稱和國家來電號碼的名稱?
- 23. 如何在iphone中獲取地理位置城市名稱?
- 24. API鍵入城市名稱並獲取可能的城市列表?
- 25. 通過sparql獲取城市信息
- 26. 如何從街道名稱,地名或城市名稱獲取GPS座標
- 27. Maxmind免費GeoIPCity.dat爲大多數IP返回空狀態和城市。
- 28. MaxMind GeoLite城市(免費)數據庫有壞數據,任何替代?
- 29. 從IPAddress獲取國家/地區,城市名稱爲PHP
- 30. 根據城市名稱獲取座標谷歌地圖
該數據庫包括德國的城市名稱。你在使用什麼API? –
使用.dat文件的PHP API – morritza