PHP скрипт определения названия города и региона через IP адрес через запрос к серверу IpGeoBase

Внимание! 20.08.2021 обнаружилось что сайт IpGeoBase стал выдавать заглушку доменного регистратора вместо сайта. Таким образом API поставляющее сведения для библиотеки было не доступно. Ранее я писал рекомендацию - временно воздержжаться от использования библиотеки, а так же о планах переписать библиотеку и настроить её в собственной базой геоинформации, которую я начал собирать чуть более полу года назад. Так вот 28 сентября 2021 года я внёс необходимные изменения и теперь гео-библиотека работает с моей собственной базой. Я не планирую сворачивать библиотеку, наоборот есть планы по её развитию и обновлению функционала. Для этого требуется свободное время.

В целом эта статья несколько раз переписывалась по мере того как происходило обновление библиотеки, а так же возникали сложности в ей использовании, например когда сервер IpGeoBase был не доступен. В целом мне надо бы выделить время и комплексно заняться этой статьей, сейчас же в следующем листинге опубликую код новой библиотеки и приведу пример её использования. Важно! Библиотека будет работать только на сайтах с установленными CRM Joomla, Bitrix и Wordpress. Библиотека самостоятельно определяет одну из указанных CMS и использует её настройки для автоматического соединения с базой данных, в которой сохраняется кеш-geo определений. До текущего момента работа библиотеки без указанных CRM не реализована. Ещё мне можно написать ВКонтакте и рассчитывать на бесплатную помощь в установке библиотеки: https://vk.com/nikolaevevge

Код библиотеки от 28 сентября 2021 года.

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

Далее идёт статья как она была до сентября, там много что бы уже нужно поправить

У сервиса IpGeoBase с 22 ноября 2019 по 25 ноября наблюдались проблемы - сервис висел. В результате чего определение IP адреса не работало и скрипт находящийся сейчас в втором листинге приводил к подвисанию ответа сайта примерно на 5 секунд. За несколько лет наблюдений за IpGeoBase это первое такое провисание. Тем не менее будет рассмотрен вариант использования какого либо аналогичного сервиса и скрипты будут доработаны для избежания зависаний на случай если проблемы у сервисов повторятся. Так же в листинге ниже представляю вариант определения geo встроенными классами Bitrix без использования IpGeoBase.

Внимание! 20.08.2021 обнаружилось что сайт IpGeoBase стал выдавать заглушку доменного регистратора вместо сайта. Таким образом API поставляющее сведения для библиотеки не доступно. Рекомендую временно воздержжаться от использования библиотеки, как появится свободное время у меня есть планы переписать библиотеку и настроить её в собственной базой геоинформации, которую я начал собирать чуть более полу года назад. Я не планирую сворачивать библиотеку, наоборот есть планы по её развитию и обновлению функционала. Для этого требуется свободное время.

Так же 25 ноября пробовал собрать свою базу из нескольких доступных в Интернет(использовал https://apps.db.ripe.net/db-web-ui/api/whois/search?abuse-contact=true&ignore404=true&managed-attributes=true&resource-holder=true&flags=B&offset=0&limit=20&query-string=88.85.172.134 и гео класс встроенный в Bitrix) столкнулся с ситуацией, что в разных базах может быть разная информация о стране IP адреса, так например для IP-адреса 55.55.12.16 SupexGeo в Bitrix считает что страна США, а ripe.net что США. Тем не менее то что получилось доступно по адресу https://blog.ivru.net/geo/?ip=88.85.172.134, не торопитесь использовать поскольку названия полей как и адрес этого API может быть изменён. На текущий момент это бета версия.

PHP скрипт определяет информацию по текущему IP адресу клиента выполняющего запрос к серверу PHP.

Есть ещё вот такой URL для получения информации о IP адресе в формате JSON http://ipinfo.io/185.252.144.107/geo (для указанного IP адреса информация определена не корректно, на самом деле этот IP адрес относится к Финляндии, арендуется Российским хостинг оператором)

Ещё есть API от 2ip.ua, но бесплатно по ним только 10 запросов в день, адреса api https://api.2ip.ua/provider.json?ip=88.85.172.134 и https://api.2ip.ua/geo.json?ip=88.85.172.134 на скрине ниже пример данных которые возвращают указанные API. Для IP адреса 88.85.172.134 информация о городе возвращена не совсем корректно. Область указана верно - Ивановская, а вот город, который указан как "Гаврилов Посад" - указан не верно. Откуда взята данная информация не понятно, например tracert показывает адрес pppoe-landeh-88-85-172-143.ivnet.ru, то есть якобы IP относится к городу Верхний Ландех, который так же находится в Ивановской области и эта информация так же не корректна. На самом деле IP адрес является статическим и относится к городу Фурманов(так же Ивановской области).

2ip.ua пример работы JSON API получения гео информации и информации о провайдере

Ещё в репозитории REMI для CentOs 7 можно выполнив команду yum install php-pecl-geoip установить стандартную штуку для работы с GEO в PHP. По идее работать с ней можно например следующим образом: var_dump(geoip_record_by_name($_SERVER["REMOTE_ADDR"])); как именно пока не выяснил, поскольку кроме установки указанной библиотеки ещё требуется скачать базу данных с адресами, чего я пока не делал. Предположительно файл базы данных городов скачивается по ссылке https://dev.maxmind.com/geoip/geoip2/geolite2/

Создаем MySQL таблицу для хранения гео-информации о IP-адресе.

Класс для работы с гео-данными в bitrix (файл nikolaevevgeIpGeo.php)

Пример работы с классом nikolaevevgeGeoIp в bitrix.

Так же начал писать библиотеку определения географии по IP адресу для CMS Joomla, WordPress и Bitrix или без CMS.

Сейчас библиотека не поддерживает соединение с базой данных в отсутствии CMS. Для Wordpress Bitrix и Joomla уже работает, при этом скажу что это Beta версия и в планах доработка а так же создание документации по методам. Код библиотеки в листинге ниже обновлен 05.12.2019.

Предварительные тесты скорости работы библиотеки

Проведённые тесты скорости работы показали на joomla версии 3.9.19 и PHP 5.4.16 следующие результаты: запрос информации у серера ipgeobase примерно 0.12 секунды, первый запрос к базе данных используя фреймворк Joomla примерно 0.0072 секунды(имеется ввиду если фреймворк ещё не выполнял каких либо запросов к бд), если же запросы к базе через фраймворк уже выполнялись, то запрос информации о IP-адресе из базы даных примерно 0.00055 секунды, если выполнить повторый запрос информации о IP-адресе в рамках той же PHP сессии, то данные будут получены из массива библиотеки примерно за 0.000035секунды. Тесты проводились на виртуальном сервере(технология виртуализации KVM) 2 ядра Xeon 2.4 и 2 Gb оперативной памяти. Пинг от виртуального сервера на котором проводилось тестирование до ipgeobase составляет примерно 3 мс. При этом записей в таблице базы данных с IP-адресами к которой осуществлялись запросы было примерно 10 штук.

Результаты WordPress примерно такие же. У Bitrix даже первый запрос выполняется обычно менее чем за 0.00055 секунды.

Описание методов библиотеки

nikolaevevgeGeoIp::get($ip) - принимает IP адрес в формате string. В случаи успеха возвращает стек адресов к которому принадлежит IP адрес(от и до в виде 2 строковых элементов массива), а так же город регион и страну к которым относится IP адрес. Если удалённый API сревис не может предоставить данные по IP адресу город, регион и страна возвращаются пустыми(такой запрос так же считается успешным). Если произошла ошибка возвращается false. Данные метод для получения результата обращается или к базе данных или к локальному кешу текущей PHP сессии, если не находит нужной информации выполняет запрос к удалённому серверу, затем сохраняя информацию в базу и локальный кеш.

nikolaevevgeGeoIp::getInfoByIpIPGeobase($ip) - метод аналогичен методу get с той лишь разницей, что запрос информации всегда осуществляется у удалённого API сервиса. Данный метод не рекомендуется использовать кроме как при тестировании, поскольку постоянные запросы к удалённому API сервису создают для него дополнительную нагрузку, а так же такие запросы более медленные чем запросы к базе данных или кешу текущей сессии. Использование данного метода напрямую в рабоичх проектах, примерно то же самое что стрелять из танка по тараканам - поскольку не используется 95% кода библиотеки и преимущества метода get.

nikolaevevgeGeoIp::getLastRequestTime - возвращает время на выполнение последнего запроса в секундах(не имеет значение каким именно образом библиотека получила данные) в виде числа с плавающей точкой, например 0.000427.

nikolaevevgeGeoIp::checkIP - служит для проверки корректности введённого IP-адреса. Принимает IPv4 адрес в формате string. Возвращает true если адрес корректен и false в обратном случаи.

nikolaevevgeGeoIp::IPToInt - преобразует строковой IP адрес в число(информация о стеках IP адресов хранится в базе данных в виде целых числел, поскольку такой подход оптимальнее для поиска, поэтому требуются функции преобразования IP адреса в число и обратно).

nikolaevevgeGeoIp::intToIP - преобразует число в строковой IP адрес.

Комментарии

Если у Вас возникли вопросы, Вы можете задать их в форме ниже. В частности если Ваш вопрос по Bitrix и что то не получается - можно спросить. Ваш e-mail не публикуется, при этом я отвечу на него если будет что то по теме. Писать необходимо для людей - избегайте сленга, пишите орфографически правильно.

Имя:
E-mail:
Текст комментария:

Вы так же можете прочитать следующие статьи: