Определение города по ip php
PHP определение IP или откуда родом ваши пользователи
Дата публикации: 2016-12-14
От автора: в интернете ваше имя и фамилия ничего не значат. Здесь для определения юзера используется IP. Зная его, можно установить город и страну проживания человека, используемый браузер…. Не верите? Все это вы поймете, когда изучите в PHP определение IP.
IP и не только
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Понятно, что искать конкретное значение в этом «великолепии» практически нереально, поэтому определение IP адреса PHP мы зададим более точно:
Теперь мы знаем, что IP записывается в REMOTE_ADDR. Откуда она берется? Все эти данные клиент пересылает во время установки соединения. Эта переменная задается в настройках сервера на стороне клиента.
Что касается браузера пользователя, то его можно попробовать определить с помощью функции get_browser (). Но для ее применения на стороне клиента в файле php.ini должен быть прописан путь к browscap.ini. Иначе получите подобное предупреждение:
Узнаем страну юзера и не только
Можно использовать уже готовые библиотеки, в которых полученный IP просто сортируется в зависимости от своего значения. Надеюсь, для вас не является секретом, что это значение присваивается клиенту (хосту) в зависимости от его геолокации: страны, города и региона проживания пользователя. На анализе этих диапазонов и построен весь функционал.
Также применяются различные сторонние сервисы наподобие ip-whois.net. С помощью скрипта вы передаете значение IP, а тот возвращает вам данные о нахождении хоста.
Кроме этого часть специализированных библиотек поставляется со своей базой данной, в таблицах которых содержатся все рассортированные (по географии) диапазоны IP. Я не буду их перечислять. Таких в Сети сейчас хватает.
Каким вариантом воспользоваться, решать вам. Применение стороннего сервиса позволит снизить затраты ресурсов и нагрузку на ваш сайт. При этом использование библиотеки с базой избавит от проблем с подключением.
Sypex Geo — быстрое определение города по IP
В начале года я публиковал статью Определение страны по IP: тестируем скорость алгоритмов, в которой упоминался мой «велосипед» отличающийся высокой скоростью работы. Одним из популярных вопросов стала возможность определения города по IP.
И вот несколько месяцев спустя, проект начинавшийся, как «for fun» перерос в самостоятельный проект.
Открыт отдельный сайт посвященный проекту Sypex Geo, на котором можно скачать свежие версии API и баз данных, а также ознакомиться с документацией.
Для желающих скорее протестировать правильность определения города по IP — вот ссылка на демо-страницу. А под хабракатом, я опишу некоторые технические подробности и приведу результаты небольшого тестирования.
Формат Sypex Geo 2.1
С момента публикации последней статьи, формат Sypex Geo (сокращенно SxGeo) был оптимизирован, а также добавлена возможность включения в БД двух справочников — городов и регионов.
Собственная база данных
После весьма близкого знакомства с популярной системой геолокации GeoLite City от MaxMind, было принято решение о создании собственной базы данных. Проблема заключается в том, что в GeoLite City очень много неточностей, мусора, городов дубликатов, излишнего дробления диапазонов, а также проблем с городами бывшего СССР (например, вместо городов взяты названия фирм или имена ответственных из Whois).
В данный момент база основана на GeoLite City, но уже содержит полностью переработанное покрытие России, Украины и Беларуси. Постепенно будут уточняться другие страны, в первую очередь СНГ и Европа. База данных Sypex Geo City содержит названия городов и регионов на русском языке в UTF-8 (встречаются еще не переведенные названия), а также timezone.
Кроме того на сайте доступны другие базы данных преобразованные в формат SxGeo 2.1.
Использование
Использование Sypex Geo API максимально упрощено.
Тестирование производительности
И на десерт, небольшое сравнительное тестирование производительности. В качестве оппонентов выступают GeoLite API и Geobaza API. Все участники тестирования используют бинарную базу данных собственного формата, и используют API на PHP. Тестирование проходит под Win 7 (на Linux пропорции сохраняются), PHP 5.2.17.
Результаты после 10 прогонов для каждого API в двух режимах (обычном и с кэшированием в памяти) усреднения и округления до десятков. Для каждого прогона создается массив из 50 000 случайных IP адресов, и в цикле осуществляется поиск каждым алгоритмом.
Предложение и пожелание приветствуются. Также ищутся желающие помочь с портированием API на другие языки, и созданием модулей для Apache и nginx.
Как в PHP узнать IP пользователя и определить его страну?
В этой статье рассмотрим, как в PHP можно узнать IP клиента и сервера, а также разберём как зная IP клиента определить его страну и город.
Как в PHP получить IP адрес посетителя сайта
Определение страны по ip с помощью Sypex Geo
Основные шаги по созданию php скрипта, с помощью которого можно будет определять страну по ip:
1. Скачаем Sypex Geo для PHP и базу данных стран. Sypex Geo распространяется по лицензии BSD, т.е. является абсолютно бесплатным.
2. Распакуем архивы и загрузим на сервер файлы «SxGeo.php» и «SxGeo.dat». В качестве примера, создадим на сервере папку SxGeo и загрузим эти файлы в неё.
3. Создадим свой скрипт, например, «get_country_code.php».
4. Вставим в этот файл следующий код:
5. Включим файл «get_country_code.php» в другие скрипты, в которых нужно реализовать выполнение кода в зависимости от принадлежности ip посетителя к той или иной стране.
Определение города по ip с помощью Sypex Geo
Для определения города, потребуется загрузить архив с базой данных городов для Sypex Geo, распаковать его и загрузить на сервер.
Скрипт в этом случае будет следующий:
Для автоматического обновления баз можно воспользоваться этим архивом. В этом архиве находится php скрипт. Этот скрипт необходимо настроить, т.е. указать в нём URL для скачивания базы и пути к файлам на сервере. После этого загрузить его на сервер и настроить его запуск по расписанию с помощью cron.
Определение страны и города по ip через сервис через сервис ipstack
Рассмотрим ещё один вариант определения в php местоположения по ip посетителя, но уже не через Sypex Geo, а с помощью сервиса ipstack.
Сервис ipstack имеет бесплатный план, который позволяет обрабатывать до 10000 запросов в месяц.
Для получения бесплатного плана нажимаем на кнопку «GET FREE API KEY» и переходим на страницу, на которой нужно заполнить регистрационную карточку.
После регистрации, на личной странице ipstack вам будет назначен «API Access Key», который нужно скопировать. Он нам потребуется при создании php скрипта.
Как в PHP получить IP адрес сервера
Узнать IP адрес сервера в PHP можно с помощью следующей инструкции:
Пример реализации определения локации в CMS MODX
В качестве примере рассмотрим, как в CMS MODX Revolution можно очень просто без сторонних сервисов осуществить определение страны посетителя. Разработаем решение на базе Sypex Geo.
1. Для этого сначала нужно загрузить Sypex Geo в проект:
Файл «SxGeo.php» – это основной скрипт, а «SxGeo.dat» – это база стран. Этих двух файлов достаточно для определения страны пользователя по его ip. Дополнительно в каталоге SxGeo ещё расположен файл «SxGeoCity.dat», данный файл в текущей реализации не нужен, он может потребовать, если в проекте потребуется определять не только страну пользователя, а ещё его регион и город.
2. Создадим сниппет, например «get_location.php». В качестве примера организуем это с помощью файлов. Для этого нужно чтобы был установлен pdoTools и в настройках включена опция «Использовать Fenom на страницах».
Код сниппета «get_location.php»:
Всё теперь чтобы написать логику достаточно использовать эту переменную.
Определение города по IP в PHP: 3 способа
Всем привет!
Не скажу, что часто, но время от времени у разработчиков появляется необходимость определения города по IP в PHP скрипте.
Например, вы решили облегчить работу пользователю по вводу контактной информации при оформлении заказа в Интернет магазине. Или хотите устанавливать язык интерфейса сайта в зависимости от страны, из которой к вам на сайт зашёл посетитель.
Ну, а чаще всего определение города по IP в PHP с помощью GeoIP, наверное, нужно разработчикам различных рекламных сетей, чтобы предлагать пользователям таргетированную рекламу в зависимости от географического местоположения.
Самому мне узнать страну по IP в PHP скрипте понадобилось всего один-единственный раз, когда я решил загружать на сайт виджеты различных соцсетей для пользователей из разных стран. Подробнее о том, зачем не это понадобилось и что в итоге получилось, я напишу в следующей статье.
А пока поговорим о том, сколько способов определения города и страны по IP в PHP существует и какие варианты их реализаций существуют.
PHP GeoIP — стандартный функционал стороннего производства
Я специально так озаглавил описание первого способа. Дело в том, что в самом PHP определить город и страну по IP адресу нельзя — язык не обладает для этого необходимыми инструментами.
Зато в официальной документации есть подсказка, как это сделать.
PHP GeoIP — это сторонняя библиотека, которую необходимо подключать дополнительно, несмотря на то, что описание функций, входящих в неё, является частью официальной документации PHP — http://php.net/manual/ru/ref.geoip.php
В принципе, мотивы разработчиков PHP вполне понятны.
Во-первых, включение данного модуля в комплект самого языка требует большого количества серверных ресурсов.
Во-вторых, GeoIP PHP работает на базе перечня IP адресов, соответствующих определённым странам и городам. Поэтому GeoIP PHP требует постоянной поддержки и расширения/модернизации существующей базы, что являлось бы лишней головной болью разработчиков PHP.
Ну, и в-третьих, определение города по IP в PHP — возможность достаточно редко используемая на практике.
В итоге, из-за этих факторов PHP GeoIP является сторонним расширением, поддержкой которого и созданием API для интеграции на существующих сайтах занимается компания MaxMind, ссылка на которую присутствует в описании данной библиотеки.
Я не буду заниматься описанием процесса её установки на сервер, т.к. я сам на практике этим не занимался, и в Интернете на данный момент полно мануалов по установке PHP GeoIP как на Linux, так и на Windows сервера.
Могу только сказать, что у данного способа определения города, страны и прочей гео информации по IP в PHP есть два существенных минуса:
Определение города по IP в PHP с помощью альтернативных библиотек
Ещё один способ узнать город по IP в PHP скрипте — это использование альтернативных серверных библиотек и баз информации для IP адресов, отличных от MaxMind.
Но они обладают теми же минусами, что и предыдущий вариант, т.к. являются всего лишь конкурентами MaxMind. Доступы к базам и возможность использования их API также платная. Бесплатно можно получить только список стран и городов по IP, в то время как при платном тарифе можно получать более широкий перечень данных.
Единственное преимущество над PHP GeoIP заключается в том, что данные библиотеки интегрируются в PHP коде, а не на уровне сервера, т.е. их можно использовать даже на shared хостингах.
Примером такой библиотеки является предоставляемая сервисом db-ip.com.
Есть ещё и другие, конечно, но я не занимался их целенаправленным поиском. Если вы знаете ещё какие-то, то можете поделиться ними в комментариях.
Кстати, указанный мною сервис предоставляет не только свою PHP библиотеку для получения гео данных по IP клиентов, но и доступ к базам информации по адресам. Так что, в принципе, никто вам не мешает использовать их в PHP GeoIP, чтобы использовать его API, но информацию брать из других источников.
Ну, и уж точно никто вам не мешает написать собственный парсер файлов баз IP адресов для получения из них информации самостоятельно, без всяких сторонних разрешений.
Как определить город по IP в PHP online
Ну, и вот я подошёл к финальному способу как узнать страну по IP в PHP и прочую гео информацию, который использовал сам на практике.
Он заключается в использовании API онлайн сервисов, которые позволяют получать данные по IP адресу в режиме онлайн.
Определять город по IP в PHP я решил именно данным способом, т.к. он лишён главного недостатка предыдущих. А именно, он самый простой в реализации — не нужно ничего устанавливать и настраивать на сервере, а, тем более, просить об этом техподдержку shared хостингов.
Для того, чтобы получить необходимую информацию по IP, достаточно всего лишь отправить запрос на определённый URL и обработать ответ.
Что касается стоимости их использования — в большинстве своём они так же платные, т.к. работают, как правило, на основе существующих коммерческих баз IP. Но есть и бесплатные сервисы, которые предоставляют, возможно, на такую полную информацию, как коммерческие, но зато её можно получать в неограниченном объёме.
Правда, они очень быстро прекращают своё существование, как ни странно, т.к. выжить предоставлением подобных услуг очень сложно. Это показал мой анализ бесплатных online сервисов определения городов и стран по IP, который я проводил в личных целях. Они мелькали на многих сайтах, но при попытке воспользоваться ими было понятно, что они прекратили своё существование.
В итоге, я отыскал то, что мне было необходимо, чем и хочу с вами определиться — http://www.geoplugin.com/
Данный сервис позволяет как определять город и другую информацию по IP на сайте сервиса, так и производить это из кода. Далее я приведу пример определения страны по IP в PHP скрипте с помощью geoplugin.com. Определение IP в PHP коде осуществляется с помощью кода, описанного в статье по ссылке.
Как видите, суть приведённого кода заключается в определении IP адреса клиента, причём учитывается возможность его подключения через прокси, и отправке запроса по API GeoPlugin с дальнейшим декодированием и анализом результатов.
В моём примере, как я уже и говорил, результатом работы данного скрипта будет являться код страны клиента сайта. Вообще, полный список возвращаемых параметров выглядит так (для примера решил взять IP Новосибирской области РФ):
Как видите, данный сервис использует упоминаемый ранее MaxMind (параметр geoplugin_credit), но платную информацию или нет — сложно предположить. С одной стороны, ссылка на источник говорит о том, что используется бесплатный доступ к БД IP, но, с другой, мы видим не только страну и город, но и ещё много всякой информации, включая город, географические координаты координаты (langitude, latitude), текущую валюту и даже её курс.
Так что данный сервис можно назвать PHP GeoIP онлайн. Единственное его отличие от серверного аналога — то, что он получает информацию по IP немного медленнее за счёт отсутствия серверного кэширования. Но это ещё не значит, что его нет на самом сервере GeoPlugin 😉 Так что недостаток этот, скорее, символический.
В любом случае, разработчики GeoPlugin заслуживают на аплодисменты, а, в особенности, ещё и за то, что они даже не захламили своё сайт контекстной рекламой. Т.е. как они вообще выживают — непонятно. Единственный способ сказать им «спасибо» — это пожертвования на PayPal счёт.
Кстати, приведённый мною PHP код для определения города по IP является универсальным. Можете его использовать для получения гео данных и с помощью других сервисов. Единственное, что вам нужно будет в нём изменить — это URL API сервиса и имя необходимых параметров, которые вам нужно будет получить.
На этом у меня всё. Пишите ваши отзывы о статье в комментариях ниже и не забывайте делиться записью со своими друзьями в социальных сетях.
Если у вас есть какие-то замечания или вы хотите поделиться другими способами определения города по IP в PHP, то оставляйте их также в комментариях.
P.S.: если вам нужен сайт либо необходимо внести правки на существующий, но для этого нет времени и желания, могу предложить свои услуги.
Более 5 лет опыта профессиональной разработки сайтов. Работа с PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, React, Angular и другими технологиями web-разработки.
Опыт разработки проектов различного уровня: лендинги, корпоративные сайты, Интернет-магазины, CRM, порталы. В том числе поддержка и разработка HighLoad проектов. Присылайте ваши заявки на email cccpblogcom@gmail.com.
И с друзьями не забудьте поделиться 😉
В продолжение темы про IP, в этой статье будут рассмотрены способы определения страны, города и другой гео-ино о пользователе по его IP.
GeoIP в виде PHP расширения
Наверное самая часто используемая библиотека для определения IP (оф. док на php.net). Оно и не мудрено, ведь бинарная БД + скомпилированное PHP расширение работают быстрее всех остальных способов.
Установка на Ubuntu Server:
После установки скачиваем последние обновления базы IP адресов:
После этих действий необходимо перезагрузить PHP. Это нужно для того что бы PHP интерпретатор подгрузил только что установленное расширение (php5-geoip) и новые базы IP адресов.
Также периодически необходимо обновлять базы IP адресов:
После обновления так же необходимо перезагружать PHP для применения обновленной базы IP адресов:
После того как GeoIP установлен, его можно использовать в коде, например так:
GeoIP в виде composer пакета
Этот способ, почти идентичен с GeoIP в виде расширения для PHP, за одним исключением: вам не нужно устанавливать на сервер дополнительные расширения.
Полезно это в том случае, если у вас нет root прав к серверу и вы не можете устанавливать PHP расширения.
Недостаток этого способа в том что он работает немного медленнее в сравнении со скомпилированным PHP расширением.
Подробную инструкцию можно почитать на офф. сайте, я лиш расскажу вкратце.
Первым делом необходимо скачать БД IP адресов в специальном формате (.mmdb) с офф. сайта, и поместить его в любую папку на сервере которая вам доступна:
Далее установить через composer офф. пакет geoip:
После этих двух несложных действий, можно начинать его использовать в своих PHP скриптах, пример:
Sypex Geo
Этот composer пакет хорош еще тем, что позволяет при выполнении команды «composer install» обновлять БД IP адресов.
Для того что бы установить этот composer пакет и настроить авто обновление БД IP адресов, нужно в файле composer.json прописать следующие настройки:
Обратите внимание на следующие настройки:
Далее выполняем установку composer пакетов:
После установки самой библиотеки, обновится и БД IP адресов с офф. сайта.
Пример использования в PHP коде:
Кроме использования composer пакета, также можно использовать REST API этого проекта, пример: http://api.sypexgeo.net/json/89.163.220.14 Об онлайн сервисах для определения гео инфы читайте ниже в этой статье.
IP2LOCATION
Еще одна composer библиотека из-за рубежа.
При установки этого composer пакета, и также при его обновлении, также будет обновляться БД IP адресов, которая находится по такому пути:
TabGeo
Появился сравнительно не давно, первая версия composer пакета была опубликована 27 сентября 2015.
Позиционирует себя как самый быстрый, по сравнению с такими конкурентами как: GeoIP и Sypex Geo. Но скорость достигается за счет малого размера базы, в следствии чего эта библиотека определяет только код страны.
Распространяется в виде composer пакета + бинарная БД в своем собственном формате.
Для установки этой библиотеки нужно всего лиш подключить composer пакет:
При этом установится как PHP библиотека так и сама БД:
Пример использования в PHP скрипте:
Стоит заметить, что TabGeo позволяет получить только двузначный код страны в формате ISO 3166-1 alpha-2. Если вам нужно что то большее, например определить регион, город, временную зону, или пр., то нужно использовать например тот же GeoIP, т.к. он позволяет все это определить.
Онлайн сервисы для гео-таргетинга
В качестве альтернативы можно использовать специальные онлайн сервисы. Принцип их работы прост: передаем GET параметром IP и в ответ получаем гео-инфу в формате JSON или XML.
Преимущество этого способы в том, что его можно использовать не только на стороне PHP, но и на стороне например JavaScript.
Но есть и существенные недостатки:
Вот несколько таких онлайн сервисов:
Заключение
Почти все вышеперечисленные библиотеки предоставляют два вида баз данных IP адресов:
Более полная БД IP адресов с городами конечно будет работать немного медленнее в силу того что она больше по объему.
Наиболее правильно использовать GeoIP в виде PHP расширения. Т.к. работать он будет всегда и быстро. Также вы всегда можете обновить базы IP адресов.
Если нет возможности установить GeoIP в виде PHP расширения, то можно использовать один из composer пакетов: GeoIP, Sypex Geo, IP2LOCATION или TabGeo.
Если же использование composer пакета по какой-то причине не возможно, тогда остается использовать онлайн сервисы. Но обязательно нужно сделать кеширование запросов на эти сервисы в свою БД. Кеширование нужно для того что бы не отправлять один и тот же запрос по много раз. Достаточно один раз получить гео-инфу по интересующему ИП через онлайн сервис, после чего сохранить ее к себе в БД, и далее брать уже из БД. Таким образом вы уменьшите кол-во запросов на онлайн сервис и уменьшите вероятность того что онлайн сервис вас заблокирует за множественные запросы.
Стоит заметить, что почти у всех вышеперечисленных библиотек есть бесплатные и платные версии. В платных версиях вам будет доступно больше гео инфы чем в бесплатных.