PECL::GeoIPを試してみた
ひょんなことから、PECL::GeoIPを試してみたのでメモ。まあ、すでにマニュアルにも結構書かれているのですが。。。
インストール
PHPマニュアルにもあるように、最初にGeoIPのCライブラリをインストールしておく必要があります。PECL::GeoIPはpeclコマンドでインストールできます。
$ wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP-1.4.5.tar.gz $ tar zxf GeoIP-1.4.5.tar.gz -C /usr/local/src/ $ cd /usr/local/src/GeoIP-1.4.5/ $ ./configure; make; sudo make install $ sudo pecl install geoip $
ちなみに、位置情報のデータファイルは、GeoIPをインストールすることで/usr/local/share/GeoIP/GeoIP.datとしてインストールされました。
で、PHPマニュアルにある「デフォルトでは、Free GeoIP Country データベースあるいは GeoLite City データベースにしかアクセスできません」とあるけど、GeoLite Cityデータベースって何じゃい?ちょっと探してみるとありました。
ここの「Download the latest GeoLite City Binary Format」からダウンロードしてunzip後、/usr/local/share/GeoIP/GeoIPCity.datとしてコピー/移動しておきます。
$ wget http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz $ gunzip GeoLiteCity.dat.gz $ sudo mv GeoLiteCity.dat /usr/local/share/GeoIP/ $
とりあえず動かしてみる
PHPマニュアルに掲載されているサンプルコードを繋げて、ちょっと修正したコードで動作確認。
<?php //define('HOST', 'www.doyouphp.jp'); define('HOST', 'www.php.net'); if (geoip_db_avail(GEOIP_COUNTRY_EDITION)) { echo geoip_database_info(GEOIP_COUNTRY_EDITION) . PHP_EOL; } $country = geoip_country_code_by_name(HOST); if ($country) { echo 'This host is located in: ' . $country . PHP_EOL; } $country = geoip_country_code3_by_name(HOST); if ($country) { echo 'This host is located in: ' . $country . PHP_EOL; } $country = geoip_country_name_by_name(HOST); if ($country) { echo 'This host is located in: ' . $country . PHP_EOL; } print geoip_database_info(GEOIP_COUNTRY_EDITION) . PHP_EOL; print geoip_db_filename(GEOIP_COUNTRY_EDITION) . PHP_EOL; print geoip_db_filename(GEOIP_CITY_EDITION_REV0) . PHP_EOL; $infos = geoip_db_get_all_info(); var_dump($infos); if (is_array($infos)) { foreach ($infos as $info) { if ($info['available']) { echo $info['description'] . ' is available' . PHP_EOL; } } } $infos = geoip_db_get_all_info(); if ($infos[GEOIP_COUNTRY_EDITION]['available']) { echo $infos[GEOIP_COUNTRY_EDITION]['description'] . PHP_EOL; } //$netspeed = geoip_id_by_name(HOST); //echo 'The connection type is '; //switch ($netspeed) { // case GEOIP_DIALUP_SPEED: // echo 'dial-up'; // break; // case GEOIP_CABLEDSL_SPEED: // echo 'cable or DSL'; // break; // case GEOIP_CORPORATE_SPEED: // echo 'corporate'; // break; // case GEOIP_UNKNOWN_SPEED: // default: // echo 'unknown'; //} //echo PHP_EOL; //$isp = geoip_isp_by_name(HOST); //if ($isp) { // echo 'This host IP is from ISP: ' . $isp . PHP_EOL; //} $org = geoip_country_code_by_name(HOST); if ($org) { echo 'This host IP is allocated to: ' . $org . PHP_EOL; } /** * GeoIPCity.datで有効 */ $record = geoip_record_by_name(HOST); if ($record) { print_r($record); } //$region = geoip_region_by_name(HOST); //if ($region) { // print_r($region); //}
実行結果は次の様な感じ。
$ php -d extension=geoip.so geoip.php GEO-106FREE 20080901 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved This host is located in: US This host is located in: USA This host is located in: United States GEO-106FREE 20080901 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved /usr/local/share/GeoIP/GeoIP.dat /usr/local/share/GeoIP/GeoIPCity.dat GeoIP Country Edition is available GeoIP City Edition, Rev 1 is available GeoIP City Edition, Rev 0 is available GeoIP ASNum Edition is available GeoIP Country Edition This host IP is allocated to: US Array ( [country_code] => US [country_code3] => USA [country_name] => United States [region] => CA [city] => Sunnyvale [postal_code] => 94089 [latitude] => 37.424900054932 [longitude] => -122.0074005127 [dma_code] => 807 [area_code] => 408 ) $
なるほどね。無償のデータベースだと、国・都市情報までしか取れないか。。。より詳細なデータが欲しい場合は商用ライセンスが必要だそうで。
ちなみに、日本の場合、緯度・経度の精度は高くないようです。