Компьютерный мастер - Allcorp66

Всем привет!

Не скажу, что часто, но время от времени у разработчиков появляется необходимость определения города по 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 адресам, предоставляемой компанией MaxMind, платный. Причём, сумма в долларах, как ни странно 🙂 Бесплатно доступны лишь существенно урезанные варианты — http://dev.maxmind.com/geoip/geoip2/geolite2/
  • Учитывая, что PHP GeoIP — стороннее расширение, его необходимо будет отдельно устанавливать на сервер, что при условии использования shared хостинга может стать затруднительным мероприятием. Можно конечно, обратиться в техподдержку, но не факт, что вам помогут. Мне, например, при просьбе установить Sphinx отказали.
  • Определение города по 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 адреса клиента, причём учитывается возможность его подключения через прокси, и отправке запроса по API GeoPlugin с дальнейшим декодированием и анализом результатов.

    В моём примере, как я уже и говорил, результатом работы данного скрипта будет являться код страны клиента сайта. Вообще, полный список возвращаемых параметров выглядит так (для примера решил взять IP Новосибирской области РФ):

    { "geoplugin_request":"195.208.128.3", "geoplugin_status":200, "geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from http:\/\/www.maxmind.com.", "geoplugin_city":"Novosibirsk", "geoplugin_region":"Novosibirsk", "geoplugin_areaCode":"0", "geoplugin_dmaCode":"0", "geoplugin_countryCode":"RU", "geoplugin_countryName":"Russian Federation", "geoplugin_continentCode":"EU", "geoplugin_latitude":"55.09", "geoplugin_longitude":"82.6519", "geoplugin_regionCode":"53", "geoplugin_regionName":"Novosibirsk", "geoplugin_currencyCode":"RUB", "geoplugin_currencySymbol":"руб", "geoplugin_currencySymbol_UTF8":"\u0440\u0443\u0431", "geoplugin_currencyConverter":58.9289 }

    Как видите, данный сервис использует упоминаемый ранее MaxMind (параметр geoplugin_credit), но платную информацию или нет — сложно предположить. С одной стороны, ссылка на источник говорит о том, что используется бесплатный доступ к БД IP, но, с другой, мы видим не только страну и город, но и ещё много всякой информации, включая город, географические координаты координаты (langitude, latitude), текущую валюту и даже её курс.

    Так что данный сервис можно назвать PHP GeoIP онлайн. Единственное его отличие от серверного аналога — то, что он получает информацию по IP немного медленнее за счёт отсутствия серверного кэширования. Но это ещё не значит, что его нет на самом сервере GeoPlugin 😉 Так что недостаток этот, скорее, символический.

    В любом случае, разработчики GeoPlugin заслуживают на аплодисменты, а, в особенности, ещё и за то, что они даже не захламили своё сайт контекстной рекламой. Т.е. как они вообще выживают — непонятно. Единственный способ сказать им «спасибо» — это пожертвования на PayPal счёт.

    Кстати, приведённый мною PHP код для определения города по IP является универсальным. Можете его использовать для получения гео данных и с помощью других сервисов. Единственное, что вам нужно будет в нём изменить — это URL API сервиса и имя необходимых параметров, которые вам нужно будет получить.

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

    P.S. : если вам нужен сайт либо необходимо внести правки на существующий, но для этого нет времени и желания, могу предложить свои услуги.

    Более 5 лет опыта профессиональной разработки сайтов. Работа с PHP , OpenCart , WordPress , Laravel , Yii , MySQL , PostgreSQL , JavaScript , React , Angular и другими технологиями web-разработки.

    Опыт разработки проектов различного уровня: лендинги , корпоративные сайты , Интернет-магазины , CRM , порталы . В том числе поддержка и разработка HighLoad проектов . Присылайте ваши заявки на email [email protected] .

    Отображать город посетителя для улучшения конверсионных показателей магазина. Готовый код вставки в любое место сайта с указанием города, региона и страны. Я перелапатил много скриптов, но именно этот оказался самым простым и результативным! Я использовал его при создании сайта www.mzm-market.ru , где скрипт выводит «доставка в______»

    Втавляем в index.tpl (или на странице доставка) в любом нужном месте cледующий код:



    window.onload =function(){
    jQuery("#user-city").text(ymaps.geolocation.city);
    jQuery("#user-region").text(ymaps.geolocation.region);
    jQuery("#user-country").text(ymaps.geolocation.country);}


    Вывод производится с помощью:

    // страна, город, регион.
    geolocation.country, geolocation.city, geolocation.region

    Хочу немного дополнить данный пост (редакция от 18.02.2017).

    При использовании вышеописанного скрипта во многих городах и браузерах просто ничего не отображалось и после долгих поисков я нашел наверное самый работоспособный скрипт определение страны, региона, города через яндекс API. Проверял его через своих клиентов, которые находятся практически по всей России и за её пределами и этот скрипт показал себя отлично! Вот скриншот моего клиента:

    Сами понимаете что всё опредилилось чётко! Ну не буду вас мучать писаниной и приведу пример!

    js Определение страны, области, города через яндекс API

    Просто вставьте этот код между тегами




    $(document).ready(function(){
    ymaps.ready(function(){
    var geolocation = ymaps.geolocation;
    $("#cou").html("Ваша страна: "+geolocation.country);
    $("#tow").html("Ваш город: "+geolocation.city);
    $("#reg").html("Ваш регион: "+geolocation.region);
    });
    });

    А этот код в нужное место на своей странице:

    Ваша страна: ... определяется...
    Ваш город: ... определяется...
    Ваш регион: ... определяется...

    Демонстрация

    Ваша страна: ... определяется...

    Ваш город: ... определяется...

    Ваш регион: ... определяется...

    Скрипт работает без проблем, но возможно, что для тех кто находится в маленьких селениях скорее всего город определиться неверно, а будет определён город вашего интернет провайдера.

    От автора: в интернете ваше имя и фамилия ничего не значат. Здесь для определения юзера используется IP. Зная его, можно установить город и страну проживания человека, используемый браузер…. Не верите? Все это вы поймете, когда изучите в PHP определение IP.

    IP и не только

    Для получения сетевой информации пользователя в PHP существует глобальный массив $_SERVER. Давайте выведем его содержимое на экран:

    Теперь мы знаем, что IP записывается в REMOTE_ADDR. Откуда она берется? Все эти данные клиент пересылает во время установки соединения. Эта переменная задается в настройках сервера на стороне клиента.

    Некоторые для определения города по IP в PHP используют значения HTTP-заголовков, но это в корне неверно. Любой пользователь может прописать значения заголовков для своего хоста. Также следует понимать, какой IP вам нужен. Например, значение HTTP_X_FORWARDED_FOR содержит адрес удаленного клиента, его прокси или может быть вообще пустым. Короче, тут разбираться не на один вечер хватит .

    Что касается браузера пользователя, то его можно попробовать определить с помощью функции get_browser (). Но для ее применения на стороне клиента в файле php.ini должен быть прописан путь к browscap.ini. Иначе получите подобное предупреждение:

    Узнаем страну юзера и не только

    Теперь с помощью PHP определим страну по IP. Но для начала проведем обзор всех решений в этой сфере. Большая часть подобных скриптов использует упомянутый нами элемент глобального массива $_SERVER REMOTE_ADDR. Теперь начинается самое главное.

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

    Также применяются различные сторонние сервисы наподобие ip-whois.net. С помощью скрипта вы передаете значение IP, а тот возвращает вам данные о нахождении хоста.

    Кроме этого часть специализированных библиотек поставляется со своей базой данной, в таблицах которых содержатся все рассортированные (по географии) диапазоны IP. Я не буду их перечислять. Таких в Сети сейчас хватает.

    Решать вам. Применение стороннего сервиса позволит снизить затраты ресурсов и нагрузку на ваш сайт. При этом использование библиотеки с базой избавит от проблем с подключением.

    В следующем скрипте для определения региона по IP PHP используется библиотека TabGeo. Сейчас ее официальный ресурс не работает. Я скачал библиотеку с GitHub, но использовал только файл country.php. В нем по полученному IP определяется страна проживания пользователя. И затем (по ISO-коду) можно реализовать редиректы на различные страницы сайта:

    Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter
    ПОДЕЛИТЬСЯ: