Sypex Geo - система для определения страны пользователя по IP. На текущий момент представлена в виде PHP-класса подключаемого в другие скрипты.
Sypex Geo - распространяется по лицензии BSD, т. е. является абсолютно бесплатным.
Скачать
Sypex Geo 2.0.0 (414 КБ) - релиз от 13.02.2012 (база данных обновлена 13.02.2012)
База WIPmania для SxGeo 2 (284 КБ) - база данных обновлена 13.02.2012
Что нового
В версии 2.0.0 был переработан, как формат файла, так и значительно оптимизирован алгоритм. В результате:
- Cкорость работы увеличилась еще в 1,7-2 раза.
- Размер файла базы данных стал на 25% меньше.
- Из-за уменьшения размера базы, уменьшилось и потребление памяти при кэшировании бд.
- Добавлен дополнительный пакетный режим, который позволяет еще на 40-45% ускорить работу, когда нужно обработать много IP за раз.
История создания
Для системы статистики нашей Sypex CMS нужен был модуль определения страны посетителей, изначально предполагалось выбрать одно из готовых решений, в частности, рассматривалась GeoIP. Было проведено тестирование по скорости, вариант с базой IP в MySQL вскоре отпал из-за низкой производительности, а вариант с бинарной базой от GeoIP (рассматривалось php API) оказался самым быстрым. Нам стало любопытно почему он так быстро работает и заглянули в исходники. После ознакомления было выявлено несколько недостатков данной реализации.
Один из основных, что для определения страны нужно 20 + n * d чтений файла (где n-количество определяемых IP, d - количество прыжков по бинарному дереву, примерно от 3 до 32). Естественно файловые операции довольно медленные, поэтому для максимальной производительности их количество желательно ограничить.
Ради спортивного интереса было был разработан свой модуль и формат бинарного файла. Скорость которого оказалась в 5 раз быстрее GeoIP, т.к. он содержал минимальное число обращений к файловой системе. Для выборки необходимо всего 2 + 1 * n (где n-количество определяемых IP)
Преимущества
Скрипт на чистом PHP + бинарный файл своего формата, сравнения производились с GeoIP (pure php api). Итак основные отличия:
- производительность в 5-7 раз выше чем у GeoIP (тестировалось на выборке 10 000 случайных IPшек, у GeoIP ~ 4 800 IP/сек, у Sypex Geo ~ 27 800 IP/сек, без кэширования базы в памяти);
- маленький размер базы (база сделанная на основе GeoLite Country, в 2 раза меньше весит);
- небольшое количество обращений к диску, для определенения IPшек нужно 3 + 1 * n чтений с диска, у GeoIP нужно 20 + n * d (где n - количество IPшек, d - количество прыжков по бинарному дереву, примерно от 3 до 32);
- как и у GeoIP есть возможность кэширования базы в памяти, что повышает производительность, еще примерно на 40-45%.
Использование
1. Скопировать SxGeo.php и SxGeo.dat на сервер
2. Подключить файл SxGeo.php в свой скрипт, добавив строку
include("SxGeo.php");
3. Создать объект SxGeo
// Первый параметр - имя файла с базой (используется оригинальная бинарная база SypexGeo.dat)
// Второй параметр - режим работы:
// SXGEO_FILE (работа с файлом базы, режим по умолчанию);
// SXGEO_BATCH (пакетная обработка, увеличивает скорость при обработке множества IP за раз)
// SXGEO_MEMORY (кэширование БД в памяти, еще увеличивает скорость пакетной обработки, но требует больше памяти).
$SxGeo = new SxGeo(); // Режим по умолчанию, файл бд SxGeo.dat
//$SxGeo = new SxGeo('SxGeo.dat', SXGEO_BATCH | SXGEO_MEMORY); // Самый производительный режим
4. Определяем страну
// $SxGeo->get_cc($ip); (возвращает двухзначный ISO-код страны)
// $SxGeo->get_num($ip); (возвращает номер страны, в соответствии с массивом $SxGeo->num2cc)
$cc = $SxGeo->get_cc($ip);
5. Если нужно осводить рессурсы вызываем метод close (не обязательно)
$SxGeo->close();








