В начале года я публиковал статью Определение страны по 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 адресов, и в цикле осуществляется поиск каждым алгоритмом.
Предложение и пожелание приветствуются. Также ищутся желающие помочь с портированием API на другие языки, и созданием модулей для Apache и nginx.
Автор: zapimir
Вот проблема когда внедряю этот скрипт в тему ВП пишет что то типа
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
а если вне темы то все работает, в чем может быть проблема?