Узнать страну по IP в PHP
Узнать страну по IP в PHP

В этом посте я хочу написать как можно с помощью php определить страну посетителя по его IP. Совсем недавно мне впервые потребовалась эта функция на одном из проектов и, как оказалось, способов существует немало, но мы выберем наиболее рациональные и быстрые.

Первым, что приходит в голову, это брать ip посетителя, слать запрос на какой-нибудь whois сервис (например http://ip-whois.net) и потом спарсить страну с полученного результата. Но это слишком долгий метод, к тому же зависимый от внешних ресурсов, поэтому он нам однозначно не подходит.

Второй способ, уже более рациональный, это скачать базу айпишников стран, сделать из неё mysql таблицу, хорошенько проиндексировать и php скриптом осуществлять поиск. Базы можно найти на многих ресурсах, как платных так и бесплатных, например на http://www.maxmind.com/app/geolitecountry можно скачать базу в CSV формате и импортировать её в mysql таблицу через phpmyadmin. Хоть и такой способ уже гораздо быстрее чем парсинг внешних сайтов, однако при большой посещаемости может создать значительную нагрузку на сервер, да и лишние запросы к базе нам ни к чему, тем более, что есть способы проще и быстрее.

Теперь о рабочих и быстрых способах

Таковые нам предлагает Maxmind. Их там всего три, простой и не очень быстрый, очень быстрый но сложный в установке и что-то среднее между этими двумя. Мы рассмотрим первый и последний. Лично я для себя выбрал последний, он и в установке не сложен и работает достаточно быстро. Что касается второго, якобы самого быстрого, так он оказался слишком уж геморным в установке, у меня на сервере хостеры так PHP скомпилировали что … короче не подошел он мне, а в том, что он будет работать быстрее третьего очень сомневаюсь.

Первый способ это обычный PHP модуль, состоит он из одного скрипта и базы, которую нужно скачивать и обновлять по этой ссылке. Модуль скачиваем отсюда. Нам нужен только geoip.inc. Копируем  geoip.inc и GeoIP.dat в папку geoip, а папку кидаем в корень сайта. Теперь в скрипте сайта, чтобы узнать страну посетителя делаем абсолютно не сложную продцедуру:

include(«geoip.inc»);
$ip= $_SERVER['REMOTE_ADDR'];
$gi = geoip_open(«/usr/local/share/GeoIP/GeoIP.dat»,GEOIP_STANDARD);
$country_name = geoip_country_name_by_addr($gi, $ip);

Такой способ работает быстрее чем sql запросы, но есть способ еще быстрее — это модуль для Апача mod_geoip. Этот модуль определит страну и добавит в массив  $_SERVER две нужные переменные: GEOIP_COUNTRY_NAME и GEOIP_COUNTRY_CODE. В отличии от первого, этот способ требует установок дополнительных модулей, а значит не подходит для виртуального хостинга. Первым делом необходимо установить GeoIP C Library. Скачиваем последнюю версию отсюда. Затем разархивируем и закачиваем на сервер, подключаемся шелом к серверу и делаем команды:

cd /путь к закаченной папке
./configure
make
make check
make install

Затем скачиваем сам модуль для апача mod_geoip с этой страницы. Обратите внимание, что для первого и второго апача модули разные. Первый апач даже вспоминать не хочется, расскажу как я устанавливал на второй.

Скачанный модуль разархивируем, копируем на сервер и в шеле делаем команду : apxs -i -a -L/usr/local/lib -I/usr/local/include -lGeoIP -c /путь к модулю/mod_geoip.c. Затем идем редактировать httpd.conf. У меня он находится в папке /usr/local/etc/apache22. Ищем строчку LoadModule geoip_module, если она закомментирована, раскомментируем, если её нет, добавляем после загрузки других модулей. После строк загрузки модулей добавляем GeoIPEnable On. Вот и всё, модуль установлен, перезагружаем сервер или просто апач.

Смотрим в phpinfo строку Loaded Modules, если там есть mod_geoip, значит все установлено правильно и модуль работает. Теперь в PHP скриптах название страны и её код будут хранится в переменных $_SERVER['GEOIP_COUNTRY_NAME'] и $_SERVER['GEOIP_COUNTRY_CODE']. Если их там нет, можно попробовать такой способ $user_country_name = apache_note(«GEOIP_COUNTRY_NAME»);.

Не забывайте обновлять базу адресов приблизительно раз в месяц. База в этом способе используется та же, что и в первом, только копировать её надо в определенное место. У меня это /usr/local/share/GeoIP/GeoIP.dat. По желанию её можно хранить в другом месте и прописать путь в httpd.conf после GeoIPEnable OnGeoIPDBFile /путь к базе айпишников/GeoIP.dat.

Сам я далеко не администратор серверов, но если что-то непонятно, задавайте вопросы в комментариях, постараюсь помочь.

Похожие записи

  • Нет похожих записей

Комментариев (2).

  1. Владимир

    Какой же третий способ?

  2. Дима

    Есть еще такой способ http://habrahabr.ru/post/146597/

Ваш комментарий

Я не робот