この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
目次
PHPで訪問者の国名を判定する方法
ウェブサイトを開発していると、
- 多言語対応のサイトにて訪問者ごとに対応する言語で表示する
- 所定の国のみで限定公開したい、または所定の国からのアクセスを遮断したい
- 海外からのアクセスのときは、プログラムの処理を変えたい
などの理由により、サイトへの訪問者の国を判定したいときがあります。
PHPで国を判定する方法として2つの方法があります。
1つ目は、IPアドレスの管理団体である「APNIC(アジアのIP管理団体)」が提供する国別とIPアドレスの一覧を取得して、プログラムを自作する。
2つ目は、本記事で紹介するGeoIPを使用した方法になります。
GeoIP2-php のインストール
まずは composer を使用して「GeoIP2-php」をインストールします。
実行するサンプルコマンド
※composer コマンドが使用できないときは、composerへのパスを設定するか、
「php /(設置先パス)/composer.phar require geoip2/geoip2:~2.0」で composer を実行します。
サンプルコマンドの実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
hogehoge@hostname:~/$ composer require geoip2/geoip2:~2.0 ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 3 installs, 0 updates, 0 removals - Installing maxmind/web-service-common (v0.5.0): Downloading (100%) - Installing maxmind-db/reader (v1.4.0): Downloading (100%) - Installing geoip2/geoip2 (v2.9.0): Downloading (100%) maxmind-db/reader suggests installing ext-bcmath (bcmath or gmp is required for decoding larger integers with the pure PHP decoder) maxmind-db/reader suggests installing ext-gmp (bcmath or gmp is required for decoding larger integers with the pure PHP decoder) maxmind-db/reader suggests installing ext-maxminddb (A C-based database decoder that provides significantly faster lookups) Writing lock file Generating autoload files |
参考元URL
https://github.com/maxmind/GeoIP2-php
GeoIP のデータベースファイルの取得
composer でインストールしたファイルには、PHPで参照するデータベースファイルが見当たりません。そのため、GeoIP の提供元である maxmind 社のホームページで、「GeoLite2 Country」のデータベース「MaxMind DB バイナリー」をダウンロードします。
DBのダウンロード先
https://dev.maxmind.com/ja/geolite2/
PHPにて国の判定プログラム
サンプルのフォルダ構成
┣ vendor (composerのインストール先)
┃ ┗ autoload.php
┗ htdocs
┣ GeoLite2-Country.mmdb
┗ getCountry.php
サンプルプログラム
「../vendor/autoload.php」のパスは自身の環境に合わせて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php require_once '../vendor/autoload.php'; use GeoIp2\Database\Reader; $ipaddress = '128.101.101.101'; //read country data $reader = new Reader('GeoLite2-Country.mmdb'); //set ip address $record = $reader->country($ipaddress); print($record->country->isoCode . "\n"); print($record->country->name . "\n"); print($record->country->names['ja'] . "\n"); |
サンプルプログラムの実行結果
1 2 3 4 |
hogehoge@hostname:~/htdocs$ php getCountry.php US United States アメリカ合衆国 |
さいごに
IPアドレスからの国名の判定は、GeoIPを使えば簡単に実装できます。
ただ注意点として、GeoIPのデータベースのライセンスは、「クリエイティブ・コモンズ 表示-継承 3.0 非移植ライセンス」であり、使用したアプリ/ウェブにはライセンス表記を行う義務が発生します。もしライセンス表記をしたくないときは、GeoLite2 Country データベースは年間252米ドル、GeoLite2 City データベースは年間456米ドルで商用ライセンスを購入する必要がありますのでご注意ください。
また時間があれば、APNICからIPアドレスの一覧を取得して日本と日本以外の判定プログラムを用意して、ご紹介します。