Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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

なるほどね。無償のデータベースだと、国・都市情報までしか取れないか。。。より詳細なデータが欲しい場合は商用ライセンスが必要だそうで。

ちなみに、日本の場合、緯度・経度の精度は高くないようです。