Геолокация на PHP с помощью сервиса ipgeobase.ru

Типичная задача разработчика сайта — определить местоположение посетителя по его IP-адресу. Очень полезен в данном случае бесплатный сервис IpGeoBase. С задачей определения города по IP-адресу для России и Украины он  справляется лучше, чем аналогичные сервисы.

Для проверки я взял 30000 IP-адресов посетителей сайта (в основном из России и Украины) и определил их местоположение. IpGeoBase для России и Украины определил регион в 98,6% случаев, в то время как GeoIP только в 78,0%, а платный geodb.ru — в 87,4%.

Существующая библиотека для работы с IpGeoBase от faniska при работе обращается к внешнему XML-сервису IpGeoBase. Для меня это является существенным недостатком: проще и быстрее работать с локальной базой. Поэтому я написал свой скрипт. Работать с ним проще простого:

Метод getRecord возвращает массив данных или false.

По умолчанию библиотека ожидает, что в той же папке лежат файлы базы: cidr_optim.txt и cities.txt. Можно передать пути к ним как параметры конструктора.

Т.к. база IP достаточно обширная, простой поиск (строка за строкой с начала файла) здесь не оптимален. Поэтому при поиске библиотека начинает искать IP адрес, начиная с середины файла cidr_optim.txt. Если искомый адрес меньше адреса в середине списка, то мы продолжаем искать в первой половине, иначе — во второй. Далее мы разбиваем оставшуюся область еще на две части и так далее рекурсивно, пока не дойдем до нужной записи. Если требуется высокая производительность, то cidr_optim.txt и cities.txt логично поместить в оперативную память.

Вы можете скачать класс для работы с архивом на GitHub. Распространяется по лицензии GPL.

https://github.com/rossvs/ipgeobase.php (нажмите кнопку «Download ZIP» справа).

Запись опубликована в рубрике PHP. Добавьте в закладки постоянную ссылку.