8
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

PHPでIPアドレスから国名とか都市名を取得する

はじめに

IPアドレスから国名や都市名を判別する方法は、ApacheやAWS Route53等で可能なのですが、アプリケーション内で判別したいケースもあるかな(ないかな?)と思いましたのでまとめました。

今回利用するリソース

MaxMindさんの GeoIP2-php および GeoLite 2データベース を使います。
※データベースは無料版を使います(データの更新は毎月第一火曜日とのことです。)

導入手順

GeoIP2-php

composerでインストールインストールします。

$ ./composer.phar require geoip2/geoip2:~2.0

~~~合わせてインストールされたpackageが表示(割愛)~~~

$ 

GeoLite 2データベース

https://dev.maxmind.com/geoip/geoip2/geolite2/
のページ下部にある「Downloads」より、

  • GeoLite2 Country
  • GeoLite2 City

の「MaxMind DB binary, gzipped」をダウンロードします。
ダウンロード後は、以下の2ファイルを使います。

  • GeoLite2-Country.mmdb
  • GeoLite2-City.mmdb

実装例

国名までの情報があれば良い場合は「GeoLite2-Country.mmdb」、都市名まで情報が欲しい場合は「GeoLite2-City.mmdb」をロードすれば良いようです。

都市情報のデータから諸々取得
<?php

require './vendor/autoload.php';

use GeoIp2\Database\Reader;

// ダウンロードしたバイナリを指定
$reader = new Reader('./db/GeoLite2-City.mmdb');

// チェックしたいIPアドレスを指定
$abeshi = $reader->city('128.101.101.101');

// IPアドレスの各情報を取得
var_dump($abeshi->country->isoCode); //国コード
var_dump($abeshi->country->name); //国名
var_dump($abeshi->country->names['ja']); //国名(日本語)
var_dump($abeshi->city->name); //都市名
var_dump($abeshi->city->names['ja']); //都市名(日本語)
実行結果
$ php ./test.php 
string(2) "US"
string(13) "United States"
string(21) "アメリカ合衆国"
string(10) "Saint Paul"
string(18) "セントポール"
$ 

さいごに

以上を活用すれば、アプリケーション内で国や都市によって挙動を変える実装ができますが、

IP geolocation is inherently imprecise.

「IP位置情報は本質的に不正確です」とある通り、過信して利用しない方が良いようです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
8
Help us understand the problem. What are the problem?