PHPでアクセス元IPから国を判別する方法いろいろ

表題の通りです。

PHPで実装されたサービスで、アクセス元の国によって動作を変えたいという要件が発生したため調べた結果をメモ。

DNSサービスを使う

今回一番関心したのがこれ。 [調べたいIP].cc.wariate.jp の TXT レコードで国コードを返してくれるDNSサービス。 詳細はこちら

$ dig 10.121.33.27.cc.wariate.jp txt +short                                                          
"AU"
  • メリット
    • 高負荷や一時的なネットワーク障害のリスクをDNSが担保してくれる
  • デメリット
    • 個人が立てているサービスなので提供停止リスクはある
    • 国コードが2文字(ISO 3166-1 alpha-2)でしか返ってこない

APIサービスを使う

IPinfoDBというサービスを使うとAPI経由でIPから国コードを取得できる。

  • メリット
    • APIなのでクライアントサイドにも流用しやすい
  • デメリット
    • クリティカルな要件ならローカルキャッシュの仕組みが必要(1秒間に2リクエストの制限あり)
    • 国コードが2文字(ISO 3166-1 alpha-2)でしか返ってこない

PECLモジュールを使う

PECL::GeoIPというモジュールを使うとIPから国だけでなく地域名、緯度、タイムゾーンなど色々調べられる。

  • メリット
    • 返り値のバリエーションが多い(US、USA、United States)
    • 名前解決がローカルで完結するので外部サービスの死活に依存しない
  • デメリット
    • 国コードが知りたいだけなら高級過ぎる気がする
    • バイナリデータを定期的にUPDATEする必要がある

他にもあれば追記する予定です。