8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-04

はじめに

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位置情報は本質的に不正確です」とある通り、過信して利用しない方が良いようです。

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?