Home » Партнерские » Библиотека nikolaevevgeGeoIp для определения гео информации по IP адресу (страны посетителя, региона, города) для CMS WordPress, Joomla, Bitrix или без CMS

Библиотека nikolaevevgeGeoIp для определения гео информации по IP адресу (страны посетителя, региона, города) для CMS WordPress, Joomla, Bitrix или без CMS

Во первых, благодарю администрацию сайта serveradmin.ru за размещение моей стати о nikolaevevgeGeoIp. Для меня данное событие не в последнюю очередь является исследованием SEO-влияния такого размещения с достаточно трастового ресурса. Возможно, по результатам аналитики позиций и трафика напишу об этом отдельную статью.

История создания библиотеки nikolaevevgeGeoIp

Поводом для написания библиотеки получения гео-информации по IP-адресу посетителя сайта послужила обычная рабочая задача - вывести телефоны в шапке сайта в зависимости от региона посетителя. Решить задачу требовалось на Bitrix, поэтому сразу же оговорюсь, что на тот момент я не знал, что у Bitrix уже был функционал для этих целей, хотя и слабо документированный на тот момент (на момент написания статьи ситуация улучшилась). Об этом функционале я так же расскажу на своём сайте, как и о других сервисах для определения города и региона по IP адресу посетителя сайта. Так же следует отметить, что на момент написания библиотеки и соответственно этой статьи уже существовала такая библиотека, как Sypex Geo, которая так же используется в Bitrix и которую (Sypex Geo) для решения Вашей задачи определения гео-информации по IP адресу вполне стоит рассмотреть наряду с моей библиотекой. При этом отмечу, что в любом случае рекомендую предварительно перейти на страницу библиотеки на моём сайте и ознакомиться с актуальным функционалом и возможностями, а так же вполне возможно с актуальной информацией сравнения с другими библиотеками Sypex Geo.

Сайт библиотеки (исходный код, установка, описание методов)

Страница библиотеки для получения гео данных по Ip адресу пользователя для CMS Joomla, WordPress, Bitrix а так же без CMS nikolaevevgeGeoIp: http://blog.ivru.net/?id=82

Соответственно, код библиотеки nikolaevevgeGeoIp доступен в листингах по ссылке выше, в текущей статье он приводиться не будет, поскольку скачивать в любом случаи рекомендую актуальную версию. Обратите внимание, для CMS Bitrix, WordPress, Joomla тем не менее необходимо скачивать один и тот же файл - поскольку библиотека умеет самостоятельно определять установленную в рабочей директории Вашего сайта CMS и даже подключать соответствующий фреймворк при необходимости. Поскольку php скрипт определения CMS я писал самостоятельно (короткие поиски в яндекс и google не дали результатов) и он получился на мой взгляд достаточно не плохой, возможно в будущем я напишу отдельную статью о том как он реализован или может быть даже появится отдельная библиотека для кросплатформенной работы с базами данных для CMS Joomla, Bitrix, WordPress, поскольку тема написания php скриптов сразу для нескольких CMS может заинтересовать разработчиков и руководителей проектов.

Пример работы с библиотекой nikolaevevgeGeoIp

Скачиваете nikolaevevgeGeoIp.php с страницы сайта библиотеки и подключаете его к Вашему проекту

require_once("путь_к_ппке_с_библиотекой/nikolaevevgeGeoIp.php");

Далее для запроса информации о IP адресе, например для 88.85.172.134 выполняет var_dump(nikolaevevgeGeoIp::get("88.85.172.134")); в результате выполнения получаем примерно следующее:

array(5) {
["minipinstack"]=> string(11) "88.85.160.0"
["maxipinstack"]=> string(13) "88.85.191.255"
["country"]=> string(2) "RU"
["region"]=> string(35) "Ивановская область"
["city"]=> string(14) "Иваново"
}

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

Обратите внимание, библиотека сама умеет подключать фреймворки Bitrix, Joomla и WordPress при работе из стороннего файла (то есть при вызове вне фреймворка). При этом производится только подключение необходимых файлов фреймоворка, поэтому если Вы уже подключили фреймворк или вызываете библиотеку в составе компонентной структуры фреймворка - повторно библиотека файлы фреймворка подключать не будет.

Настройки библиотеки nikolaevevgeGeoIp

В самом файле библиотеки nikolaevevgeGeoIp.php в начале класса библиотеки находятся статические переменные $timeToUpdate, $timeToDeleteEmtyRecords, $tableName, $probabilityQueryToDeleteOldRecords. Вы можете изменить значения данных переменных в зависимости от требований по Вашей задаче.

Переменная $timeToUpdate - значение времени, через которое после создания записи в таблице базы данных с информацией о стеке IP адресов будут удаляться старые записи. По умолчанию установлено 20 дней. Исходя из посещаемости Вашего сайта, Вы можете установить данное значение на более приемлемое.

Переменная $timeToDeleteEmtyRecords - значение времени в секундах, через которое после создания записи в таблице базы данных с информацией о стеке IP адресов, будут удаляться записи о стеках, по которым удалённый API сервис не предоставил информацию. По умолчанию значение равно 300 секунд (или 5 минут).

Переменная $tableName - название таблицы в базе данных, в которой хранятся записи с информацией о стеках IP-адресов. В WordPress и Joomla к названию этой таблицы автоматически будет добавлен префикс для таблиц CMS. По умолчанию таблица называется nikolaevevgegeoipdata.

Переменная $probabilityQueryToDeleteOldRecords - вероятность, с которой библиотека будет отправлять серверу базы данных запросы на удаление старых записей с информацией о стеках IP-адресов. По умолчанию установлена в значение 100, то есть запросы выполняются с вероятностью 1 из 100 раз (или 1%).

Источники получения гео-информации о IP адресах

На момент написания статьи библиотека работает по API с сервисом ipGeoBase (при этом смотрите актуальную информацию на странице сайта библиотеки, поскольку изменения прежде всего публикуются там, эта же статья является частью истории библиотеки). Если у Вас возник вопрос - зачем я называю небольшой скрипт который запрашивает информацию по API у сервера ipGeoBase библиотекой - Ваш вопрос справедлив! Дело в том что когда я в своём блоге (ссылка на который приводилась выше) написал статью о том, как получить информацию о географии IP-адреса пользователя с помощью сервиса ipGeoBase и выложил тот самый короткий php скрипт, который сам написал - примерно через 2 месяца сервис ipGeoBase завис на несколько дней (если точнее с 22 ноября по 25 ноября 2019 года сервис ipGeoBase был не доступен). Я не утверждаю, что именно скачивания этого скрипта привели к падению ipGeoBase, тем не менее такая вероятность существует с учётом статистики посещений страницы где был размещён указанный скрипт.

Кроме того, прямые синхронные обращения к серверу ipGeoBase при каждом вызове скрипта приводили к задержке генерации страницы сайта. Например, на виртуальном сервере в городе Москва пинг от которого до ipGeoBase составлял примерно 3 мили секунды, работа скрипта по определению географии пользователя по IP адресу с использованием запросов к ipGeoBase по API добавляла примерно 11-12 мили секунд к времени генерации страницы. Именно в том рабочем проекте ситуация была исправлена использованием сессий PHP, то-есть запрос по api к ipGeoBase выполнялся только для новых посетителей сайта в рамках сессии, далее полученная информация сохранялась в сессию и если IP адрес посетителя сайта не менялся (понятно, что это наиболее вероятная ситуация, тем не менее такую проверку я всё же написал) то информация о географии IP адреса использовалась из сессии, что позволяло при повторных обращениях к сайту посетителя экономить на генерации страниц те самых 11-12 мили секунд.

При этом такую надстройку в изначальной статье я не описал, и, следовательно, пользователи, скачавшие скрипт, могли создавать обращения к ipGeoBase по api каждый раз, когда требовалось работать с гео-информацией. Таким образом, nikolaevevgeGeoIp - это библиотека, которая позволяет обращаться по api к удалённому серверу для получения гео-информации об IP-адресе только для стеков Ip-адресов, по которым информация ранее не запрашивалась или запрашивалась давно (в настройках библиотеки есть переменная которая позволяет установить через какой промежуток времени информация считается устаревшей).

Принципы работы библиотеки nikolaevevgeGeoIp

В момент обращения к функционалу библиотеки по запросу гео-информации об IP адресе, библиотека определяет Вашу CMS и если это Joomla, WordPress или Bitrix, использует драйвер соединения с базой данных, чтобы запросить информацию об IP адресе из записи в таблице базы данных, относящейся к соответствующему стеку IP-адресов.

В базе данных информация хранится именно о стеке IP-адресов, а не об одном IP-адресе. Дело в том, что провайдеры арендуют IP-адреса последовательными стеками, поскольку сервис ipGeoBase предоставляет информацию так же о стеке адресов, не целесообразно хранить информацию в базе об одном адресе, поскольку информация для всего стека является одинаковой. То есть разные IP адреса из одного стека не могут иметь каких либо отличий в гео-информации (это не означает, что фактически, например, город, указанный в такой информации , является точным, например в 2018 году провайдер Ростелеком в Ивановской области предоставлял IP адреса, относящиеся к стеку Ростелеком-Рязань, ситуацию поправили в 2019 году, что не означает, что у этого или другого провайдера ситуация не повторится).

Если библиотека не найдёт информацию об IP адресе в базе данных, отправляется запрос к удалённому сервису по API. Полученная по API информация сразу же сохраняется в базу данных. Кроме того, информация о запрошенных стеках IP адресов сохраняется в статическую переменную (массив) класса библиотеки. Это позволяет не запрашивать повторно информацию о одних и тех же IP адресах у базы данных в рамках PHP сеанса, что так же позволяет выполнить запрос быстрее и снять нагрузку с базы данных.

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

Как ранее уже было написано - библиотека сохраняет полученные от удалённого api сервера полученную информацию о географии IP адресов (для ipGeoBase - это страна, город и регион) в базу данных. Для работы библиотеки в CMS Bitrix, WordPress, Joomla вам не потребуется прописывать в библиотеке параметры соединения с базой данных (логин, пароль, хост, имя базы данных), поскольку для работы с базой данных библиотека использует драйверы CMS и,  следовательно, информация для соединения с базой данных не требуется. Вам так же не потребуется вручную создавать таблицу базы данных, поскольку данный процесс так же автоматизирован для CMS Joomla, Bitrix, WordPress.

При получении ошибки об отсутствии таблицы в базе данных, библиотека выполнит запрос на её создание, сама ошибка никак не отобразиться - поскольку ситуация с отсутствием таблицы при начале использования считается нормальной и это часть логики работы библиотеки. Название таблицы в базе данных, где библиотека будет хранить данные, Вы можете задать в настройках библиотеки. О настройках ниже в этой статье будет рассказано подробнее. Старые записи из базы данных удаляются, время удаления настраивается.

Кроме того настраивается вероятность, с которой будет выполняться запрос к базе данных на удаление старых записей (для уменьшения количество запросов к базе данных, запрос на удаление старых записей о стеках IP-адресов не выполняется каждый раз). Если по какой то причине библиотека самостоятельно не сможет создать таблицу в базе данных (например у пользователя базы данных нет прав на создание таблиц), на странице сайта о библиотеке есть SQL запрос для создания таблицы и Вы можете выполнить его самостоятельно. Сама библиотека никак не уведомляет о том, что не удалось создать таблицу (на момент написания статьи, в будущем возможно добавление функционала для диагностики состояния, поэтому рекомендуется ознакомиться с актуальной информацией на странице сайта библиотеки nikolaevevgeGeoIp).

При этом у библиотеки есть метод, показывающий за какое время был выполнен последний запрос по определению гео информации об IP адресе, если информация была получена из базы данных, такой запрос выполняется примерно от 0.0002 до 0.01 секунды. Если же выполнялся запрос к удалённому API сервису, время запроса может составлять более 0.01 секунды. Обратите внимание, если библиотеке не удалось создать таблицу в базе данных, запросы всегда будут отправляться к удалённому api сервису. Таким образом, по времени выполнения запроса можно диагностировать корректную работу библиотеки. Выполнение запросов к базе данных крайне желательно, поскольку иначе 95% кода библиотеки не используется и соответственно преимущества использования библиотеки.

Преимущества использования библиотеки nikolaevevgeGeoIp

  • Одна библиотека для CMS Joomla, WordPress, Bitrix а так же других CMS и без CMS.
  • Легкая установка - просто скопируйте файл библиотеки nikolaevevgeGeoIp.php и подключите его через require. Для wordpress, joomla, bitrix библиотека сама определит настройки соединения с базой данных и создаст таблицу для хранения информации.
  • Не требуется размещать и скачивать объемную базу данных, поскольку запрашивается только информация только для нужных стеков IP адресов у удалённого сервиса.
  • Не требуется думать над обновлением базы, поскольку информация о старых записях удаляется из базы и при необходимости заново запрашивается у удалённого сервиса по api.
  • Библиотека сохраняет информацию о стеках IP адресов, с которыми ведётся работа в базу данных, что ускоряет работу и снижает нагрузку на api сервис предоставляющий данные.
  • Информация о стеках IP адресов, ранее запрошенных у библиотеки, в процессе той же PHP-сессии берётся из статической переменной класса, а не приводит к повторным запросам к базе данных. Такой подход быстрее и меньше нагружает сервер, не заставляет разработчика задумываться о сохранении информации для повторного использования.

Недостатки использования библиотеки nikolaevevgeGeoIp

  • В случае, если API сервис, предоставляющий информацию, перестанет работать, библиотека не сможет получить данные о географии IP адреса.
  • Запросы к API сервису медленнее (примерно от 10 мили секунд требуется на 1 запрос) чем запросы к базе данных, размещённой на том же сервере что и web-сервер (такие запросы библиотека выполняет только для стеков IP-адресов, по которым информация запрашивается впервые, далее, пока информация не устареет, при повторном запросе информация будет получена из базы данных).

Описание некоторых методов для работы с библиотекой nikolaevevgeGeoIp

Метод:

get("88.85.172.134");

- запрашивает гео-информацию об IP адресе. Метод самостоятельно выбирает, получать ли информацию из переменной, либо базы, либо удалённого сервиса по API. Метод так же сохраняет информацию в базу данных в случае, если информация была получена по API.

getInfoByIpIPGeobase("88.85.172.134");

- запрашивает гео-информацию о IP адресе у удалённого API сервиса ipGeoBase. Данный метод не рекомендуется использовать, кроме как для тестирования, поскольку в данном случае не используются преимущества работы с библиотекой.

getLastRequestTime();

- возвращает время выполнения последнего запроса в секундах.

checkIP("88.85.172.134");

- проверяет корректность IPv4 адреса в формате string. Если IP корректен, возвращает true, иначе false.

IPToInt("88.85.172.134");

- переводит IPv4 адрес в формате string в число. Такая необходимость связана с тем, что хранить информацию о стеках IP адресов в базе данных выгоднее с целью дальнейшего поиска именно как целое число.

intToIP(1482009734);

- переводит целое число в IPv4 адрес в формате string.

В библиотеке есть и другие методы, но нет смысла описывать их, поскольку они реализуют работу описанных выше методов.

О целесообразности использования библиотеки nikolaevevgeGeoIp в bitrix

Как уже выше написал, библиотека nikolaevevgegeoIp изначально использовалась на сайте,  работающем на CMS Bitrix, при этом на момент написания библиотеки я не знал о существовании аналогичного функционала в самом Bitrix. Речь идёт о классе \Bitrix\Main\Service\GeoIp\Manager и например о его методе getDataResult(NULL,"ru").

Сам Битрикс использует для этих целей сервис Supex Geo. В данной статье я не буду подробно описывать методы работы с Supex Geo, как отдельные, так и через Bitrix. При этом, поскольку моей целью является не создание конкуренции, а описание ситуации связанной с определением гео информации по IP адресу, на странице сайта моей библиотеки как сравнительная характеристика так и примеры кода использования класса Manager в битрикс и Supex Geo присутствуют.

Кроме того, у Supex Geo есть свой сайт и описание их библиотеки, а у Bitrix есть описание API для \Bitrix\Main\Service\GeoIp\Manager. Подводя итог, использовать ли библиотеку nikolaevevgegeoIp в битрикс? На момент написания статьи ответ следующий: использовать можно, но зачем если есть стандартное решение, которое к тому же предоставляет информацию и о странах, IP адреса которых не относятся к странам бывшего СНГ. В дальнейшем же с развитием библиотеки вполне может быть, что объём информации, который сможет предоставить библиотека nikolaevevgegeoIp об IP адресе будет больше чем тот, который предоставляет Bitrix или Supex Geo (как платной так и бесплатной версии), поэтому если Вы заинтересованы в большем объеме информации об IP адресе, нежели предоставляет Bitrix или Supex Geo - лучше прочитать актуальную информацию по данному вопросу на странице сайта библиотеки.

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

Bitrix geoip

php классы для geoip в bitrix

На скриншоте выше Вы можете видеть, где находится геолокация в Bitrix админке и описание классов для PHP разработчиков.

О сервисе ipGeoBase, его API интерфейсе и применимости в библиотеке nikolaevevgeGeoIp

Прежде всего хочется в адрес ipGeoBase сказать слова благодарности: ещё в 2009 году (или чуть ранее) нашёл базу данных IP-адресов именно на их сайте и использовал в своей системе статистики посещаемости интернет сайтов Ивановской области (которая до настоящего времени не сохранилась) для определения региона и города пользователя.

На тот момент эту базу я закачал в mySql на выделенном сервере с 320 Mhz и с 128 мегабайтами оперативки. Максимальная нагрузка системы составляла примерно 15000 уникальных хостов и 60000 просмотров в день. В 2010 году данная система стала темой моего дипломного проекта, всё с тем же ipGeoBase для определения географии. Далее я по мере возникновения задач по определению географии обращался к сервису ipGeoBase и в целом устраивало. В 2019 я впервые применил API от ipGeoBase для тех же целей, поскольку такой подход для задач которые требовалось выполнить быстро не требовал размещения базы данных и выложил код скрипта в своём блоге, через пару месяцев заметив что сервис ipGeoBase перестал работать примерно на 3 дня, что послужило поводом для написания библиотеки которая сохраняла бы в базу информацию об IP адресах, информация по которым ранее уже запрашивалась.

API от ipGeoBase я так же стал использовать поскольку на их сайте не было возможности скачать актуальные базы, на тот момент они были 2017 года. Предполагая, что по API сервис может предоставлять более актуальные данные. Более ли актуальные данных предоставляет API сказать не могу, не смотря на то, что писал администрации сервиса на e-mail - ответов на свои письма не получил. Таким образом, в каком виде будут существовать ipGeoBase далее и каковы перспективы его развития, если таковые существуют, сейчас не известно. При этом ipGeoBase уступает Supex Geo как минимум в предоставлении информации по IP адресам не относящимся к странам бывшего СНГ, при этом качество определения города и региона по России остаётся приемлемым (на конце 2019 года, если у Вас другие данные - прошу в комментарии). Сервис бесплатный, не выявлено каких либо лимитов - поэтому и применён в nikolaevevgeGeoIp как api для гео запросов.

ipGeoBase ripe ncc Информация об ip адресе

На скриншотах выше сайт ipGeoBase и ripe, на которые есть смысл зайти и посмотреть, какие данные могут предоставлять сервисы перед написанием программ по геолокации.

Возможности Supex Geo

На момент написания статьи не использовался в библиотеке nikolaevevgeGeoIp. Устанавливается размещением на хостинге одного php файла библиотеки (с последующим подключением к рабочему проекту через require) и базы данных для формата UTF-8 размером примерно 37 мегабайт. База данных обновляется путём закачивание новой версии с сайта (то есть вручную) или отдельным php файлом на который устанавливается cron. Сервис в момент написания статьи достаточно популярен, исходя из информации на сайте база данных в актуальном состоянии. Кроме информации о стране, городе и регионе, предоставляет данные о географических координатах. По отношению к ipGeoBase база более широкая - так как информация предоставляется о странах всего мира.

Supex Geo имеет вариант использования по API, предполагающий получение ключа. Есть платный и бесплатный вариант использования, существуют лимиты на запросы, подробнее о которых лучше узнать на сайте Supex Geo (это не относится к варианту с размещением базы на Вашем хостинге). На момент написания данной статьи API не тестировал, поскольку меня прежде всего вариант использования без лимитов.

Supex Geo

На скриншоте выше страница сайта Supex Geo, на которой можно скачать php скрипт библиотеки и базу данных для него.

<?php require_once("SxGeo.php"); 
$SxGeo = new SxGeo('SxGeoCity.dat');// здесь указываем путь до базы данных 
$ip = "88.85.172.134"; var_export($SxGeo->getCityFull($ip));// Вся информация о городе
var_export($SxGeo->get($ip));// Краткая информация о городе или код страны

Автор Zerox

Zerox
Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

Добавить комментарий

Ваш адрес email не будет опубликован.

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.