Ваш Интернет IP-адрес: 100.26.179.196 | Здесь будет информация о Вашем локальном IP-адресе, а эта строчка будет заменена. | Вы IT-шник? А знаете как определить IP-адрес пользователя в локальной сети используя HTML5 и JavaScript? Возможно Вам так же будет интересно чем может закончиться суд по иску программиста к "IT-компании" по поводу незаконного увольнения на примере ООО "Софт Навигатор" в городе Иваново.

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

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

Так же 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:
Текст комментария:

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