Help us understand the problem. What is going on with this article?

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした