Sypex Geo — быстрое определение города по IP

в 3:33, , рубрики: geoip, geolocation api, ipgeobase, php, sxgeo, sypex geo, Веб-разработка, геолокация, метки: , , , , ,

Sypex Geo — быстрое определение города по IPВ начале года я публиковал статью Определение страны по IP: тестируем скорость алгоритмов, в которой упоминался мой «велосипед» отличающийся высокой скоростью работы. Одним из популярных вопросов стала возможность определения города по IP.

И вот несколько месяцев спустя, проект начинавшийся, как «for fun» перерос в самостоятельный проект.
Открыт отдельный сайт посвященный проекту Sypex Geo, на котором можно скачать свежие версии API и баз данных, а также ознакомиться с документацией.

Для желающих скорее протестировать правильность определения города по IP — вот ссылка на демо-страницу. А под хабракатом, я опишу некоторые технические подробности и приведу результаты небольшого тестирования.

Формат Sypex Geo 2.1

С момента публикации последней статьи, формат Sypex Geo (сокращенно SxGeo) был оптимизирован, а также добавлена возможность включения в БД двух справочников — городов и регионов.

При создании нового формата, ставились следующие приоритеты:

  • высокая скорость
  • низкое потребление ресурсов
  • открытость (спецификации формата бинарного файла БД и API открыты)
  • универсальность (возможность создания баз данных с любыми наборами данных)

Формат позволяет хранить данные в разной кодировке. После выхода из беты, будут опубликованы скрипты для конвертирования базы данных из MySQL в бинарный файл БД.

В БД хранится следующая информация:

  • ID страны
  • Код страны ISO 3166-1 (двухсимвольный)
  • Код региона FIPS 10-4 (двухсимвольный)
  • Название региона (опционально)
  • Город
  • Широта
  • Долгота
  • Timezone (опционально)

Этот список может быть изменен и/или расширен при необходимости. Более подробную информацию о формате SxGeo 2.1 можно найти на сайте.

Собственная база данных

После весьма близкого знакомства с популярной системой геолокации GeoLite City от MaxMind, было принято решение о создании собственной базы данных. Проблема заключается в том, что в GeoLite City очень много неточностей, мусора, городов дубликатов, излишнего дробления диапазонов, а также проблем с городами бывшего СССР (например, вместо городов взяты названия фирм или имена ответственных из Whois).

В данный момент база основана на GeoLite City, но уже содержит полностью переработанное покрытие России, Украины и Беларуси. Постепенно будут уточняться другие страны, в первую очередь СНГ и Европа. База данных Sypex Geo City содержит названия городов и регионов на русском языке в UTF-8 (встречаются еще не переведенные названия), а также timezone.

Кроме того на сайте доступны другие базы данных преобразованные в формат SxGeo 2.1.

Использование

Использование Sypex Geo API максимально упрощено.

1. Скопировать SxGeo.php и SxGeoCity.dat (или другие базы) на сервер
2. Подключить файл SxGeo.php в свой скрипт, добавив строку

include("SxGeo.php");

3. Создать объект SxGeo

//$SxGeo = new SxGeo(); // Режим по умолчанию, файл бд SxGeo.dat
$SxGeo = new SxGeo('SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY); // Самый быстрый режим

4. Определяем город (SxGeo City, GeoLite City, IpGeoBase)

$SxGeo->get($ip); (возвращает информацию о городе, без названия региона и временной зоны)
// $SxGeo->getCityFull($ip); (возвращает полную информацию о городе и регионе)

Тестирование производительности

И на десерт, небольшое сравнительное тестирование производительности. В качестве оппонентов выступают GeoLite API и Geobaza API. Все участники тестирования используют бинарную базу данных собственного формата, и используют API на PHP. Тестирование проходит под Win 7 (на Linux пропорции сохраняются), PHP 5.2.17.

Результаты после 10 прогонов для каждого API в двух режимах (обычном и с кэшированием в памяти) усреднения и округления до десятков. Для каждого прогона создается массив из 50 000 случайных IP адресов, и в цикле осуществляется поиск каждым алгоритмом.
Sypex Geo — быстрое определение города по IP

Предложение и пожелание приветствуются. Также ищутся желающие помочь с портированием API на другие языки, и созданием модулей для Apache и nginx.

Автор: zapimir

  1. Анатолий:

    Вот проблема когда внедряю этот скрипт в тему ВП пишет что то типа

    Warning: fopen(SxGeoCity.dat) [function.fopen]: failed to open stream: No such file or directory in /home/pinchoal/public_html/wp-content/themes/twentyeleven/SxGeo.php on line 58

    Warning: fread() expects parameter 1 to be resource, boolean given in /home/pinchoal/public_html/wp-content/themes/twentyeleven/SxGeo.php on line 60
    Can’t open SxGeoCity.dat

    а если вне темы то все работает, в чем может быть проблема?

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js