Определение города по ip php. PHP определение IP или откуда родом ваши пользователи

Подписаться
Вступай в сообщество «allcorp24.ru»!
ВКонтакте:

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

Узнать страну по IP-адресу через PHP можно двумя путями. Первый путь - это воспользоваться каким-нибудь WHOIS-сервисом , отправив на него запрос и получить от него ответ. Второй вариант - создать свою таблицу в базе данных, в которой будут находиться соответствия IP-адресов и стран . Плюсы и минусы первого и второго способа очевидны, поэтому не буду на них останавливаться. Второй способ реализации зависит от Вашей базы данных и от таблицы, в которой находятся соответствия IP-адресов и стран. Поэтому мы с Вами рассмотрим первый способ, так как он универсален, хотя, безусловно, на локальном сервере без подключения к Интернету Вы не сможете протестировать данный скрипт:

Кратко принцип: находим сервис, смотрим, как надо отправлять запрос (как называются переменные, каким методом отправляются), отправляем через cURL запрос, получаем ответ, вытаскиваем нужную строку через регулярные выражения, выводим результат. Если Вы запустите этот скрипт, то увидите название страны, которой принадлежит Ваш IP-адрес . Однако, стоит отметить, что далеко не для каждого IP-адреса возможно узнать страну. Тут зависит от базы, которую использует конкретный WHOIS-сервис . Сразу скажу, что для тестирования этого скрипта надо его загрузить на удалённый сервер, чтобы не подставлялся IP-адрес : 127.0.0.1 , так как он не сработает, ведь для него страны не сущесвует. Либо же просто замените значение переменной $ip на какой-нибудь другой IP-адрес . Как видите, всё очень просто, главное, здесь чётко выбрать один из двух способов. Если Вы захотите узнавать страну по IP-адресу через свою базу данных, то тогда Вам надо её предварительно найти. Их достаточно много, поэтому просто поищите их в Интернете. А если Вас устраивает пользоваться WHOIS-сервисом и экономить ресурсы своего сервера и место в базе данных, то тогда можете использовать код выше, а, доработав регулярное выражение, Вы можете вытащить и другие данные, которые выдаёт данный сервис, например, город.

В которой упоминался мой «велосипед» отличающийся высокой скоростью работы. Одним из популярных вопросов стала возможность определения города по IP.

И вот несколько месяцев спустя, проект начинавшийся, как «for fun» перерос в самостоятельный проект.
Открыт отдельный сайт посвященный проекту Sypex Geo , на котором можно скачать свежие версии API и баз данных, а также ознакомиться с документацией.

Для желающих скорее протестировать правильность определения города по IP - вот ссылка на демо-страницу . А под хабракатом, я опишу некоторые технические подробности и приведу результаты небольшого тестирования.

Формат Sypex Geo 2.1 С момента публикации последней статьи, формат Sypex Geo (сокращенно SxGeo) был оптимизирован, а также добавлена возможность включения в БД двух справочников - городов и регионов.

При создании нового формата, ставились следующие приоритеты:

  • высокая скорость
  • низкое потребление ресурсов
  • открытость (спецификации формата бинарного файла БД и API открыты)
  • универсальность (возможность создания баз данных с любыми наборами данных)
Формат позволяет хранить данные в разной кодировке. После выхода из беты, будут опубликованы скрипты для конвертирования базы данных из MySQL в бинарный файл БД.

В БД хранится следующая информация:

  • ID страны
  • Код страны ISO 3166-1 (двухсимвольный)
  • Код региона FIPS 10-4 (двухсимвольный)
  • Название региона (опционально)
  • Город
  • Широта
  • Долгота
  • Timezone (опционально)
Этот список может быть изменен и/или расширен при необходимости. Более подробную информацию о формате SxGeo 2.1 можно найти на сайте. Собственная база данных После весьма близкого знакомства с популярной системой геолокации GeoLite City от MaxMind, было принято решение о создании собственной базы данных. Проблема заключается в том, что в GeoLite City очень много неточностей, мусора, городов дубликатов, излишнего дробления диапазонов, а также проблем с городами бывшего СССР (например, вместо городов взяты названия фирм или имена ответственных из Whois).

В данный момент база основана на GeoLite City, но уже содержит полностью переработанное покрытие России, Украины и Беларуси. Постепенно будут уточняться другие страны, в первую очередь СНГ и Европа. База данных Sypex Geo City содержит названия городов и регионов на русском языке в UTF-8 (встречаются еще не переведенные названия), а также timezone.

Кроме того на сайте доступны другие базы данных преобразованные в формат SxGeo 2.1.

Использование Использование Sypex Geo API максимально упрощено.
1. Скопировать SxGeo.php и SxGeoCity.dat (или другие базы) на сервер 2. Подключить файл SxGeo.php в свой скрипт, добавив строку include("SxGeo.php"); 3. Создать объект SxGeo //$SxGeo = new SxGeo(); // Режим по умолчанию, файл бд SxGeo.dat $SxGeo = new SxGeo("SxGeoCity.dat", SXGEO_BATCH | SXGEO_MEMORY); // Самый быстрый режим 4. Определяем город (SxGeo City, GeoLite City, IpGeoBase) $SxGeo->get($ip); (возвращает информацию о городе, без названия региона и временной зоны) // $SxGeo->getCityFull($ip); (возвращает полную информацию о городе и регионе) Тестирование производительности И на десерт, небольшое сравнительное тестирование производительности. В качестве оппонентов выступают GeoLite API и Geobaza API. Все участники тестирования используют бинарную базу данных собственного формата, и используют API на PHP. Тестирование проходит под Win 7 (на Linux пропорции сохраняются), PHP 5.2.17.

Результаты после 10 прогонов для каждого API в двух режимах (обычном и с кэшированием в памяти) усреднения и округления до десятков. Для каждого прогона создается массив из 50 000 случайных IP адресов, и в цикле осуществляется поиск каждым алгоритмом.

Предложение и пожелание приветствуются. Также ищутся желающие помочь с портированием API на другие языки, и созданием модулей для Apache и nginx.

В продолжение темы про IP, в этой статье будут рассмотрены способы определения страны, города и другой гео-ино о пользователе по его IP.

GeoIP в виде PHP расширения

Наверное самая часто используемая библиотека для определения IP (оф. док на php.net). Оно и не мудрено, ведь бинарная БД + скомпилированное PHP расширение работают быстрее всех остальных способов.

Установка на Ubuntu Server:

Sudo apt-get install php5-geoip

После установки скачиваем последние обновления базы IP адресов:

После этих действий необходимо перезагрузить PHP. Это нужно для того что бы PHP интерпретатор подгрузил только что установленное расширение (php5-geoip) и новые базы IP адресов.

Также периодически необходимо обновлять базы IP адресов:

Sudo wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz sudo gunzip GeoIP.dat.gz sudo mv GeoIP.dat /usr/share/GeoIP/

После обновления так же необходимо перезагружать PHP для применения обновленной базы IP адресов:

Sudo service php5-fpm restart # если вы используете NGINX # или sudo service apache2 restart # если вы используете Apache

После того как GeoIP установлен, его можно использовать в коде, например так:

geoPlugin

Онлайн-сервис определения страны и города подключается к сайту следующим образом:

< script src= "http://www.geoplugin.net/javascript.gp" type= "text/javascript" >

После подключения можно вызывать следующие методы:

geoplugin_request() - IP
geoplugin_status() - статус (200б 4040 и т. д.)
geoplugin_credit() - благодарности сервису MaxMind, упомянутому чуть выше.
geoplugin_city() - город
geoplugin_region() - область или регион
geoplugin_areaCode() - код зоны
geoplugin_dmaCode() - американский код из трех цифр, определяющий набор поддерживаемых телеканалов
geoplugin_regionCode() - код региона
geoplugin_regionName() - название региона
geoplugin_countryCode() - двухбуквенный код страны
geoplugin_countryName() - название страны на английском языке
geoplugin_continentCode() - код континента (например EU - Европа)
geoplugin_latitude() - широта
geoplugin_longitude() - долгота
geoplugin_currencyCode() - трехбуквенный код валюты страны
geoplugin_currencySymbol() - символ валюты страны

Также можно не подключать библиотеку, а использовать JSONP:

$.getJSON ("http://www.geoplugin.net/json.gp?jsoncallback=?" , function (response) { for (var i in response) { document.write ("response[" + i + "] = " + response[ i] + "
" ) ; } } ) ;

$.getJSON("http://www.geoplugin.net/json.gp?jsoncallback=?", function (response) { for (var i in response) { document.write("response[" + i + "] = " + response[i]+ "
"); } });

Достоинство - кроме страны можно получить информацию о валюте и ее код (₴, €, ₽).

Недостаток - запросы по HTTPS платные, подписка стоит €12 в год.

ipinfo.io

Открытый сервис, позволяющий бесплатно делать до 1000 запросов в сутки .

Чтобы вызвать его в js используется код

$.getJSON ("http://ipinfo.io" , function (response) { console.log (response) ; } )

$.getJSON("http://ipinfo.io", function(response){ console.log(response); })

В ответе вы получите:

"ip" - IP адрес пользователя
"hostname" - обратный IP
"city" - предположительный город, в котором находится пользователь
"region" - регион (область, район)
"country" - страна в виде двухбуквенного кода
"loc" - координаты широты и долготы
"org" - информация о провайдере

Сервис поддерживает HTTPS, можно использовать его на сайтах с поддеpжкой HTTPS. Чтобы избежать проблем с кросс-доменными запросами, которые Chrome ограничивает, можно воспользоваться поддержкой JSONP:

$.get("https://ipinfo.io?callback=?", function(response) { $("body").text(response.ip+ " from " +response.country); // вывести IP и страну посетителя. }, "jsonp")

Практически полный клон ipinfo - сервис ipapi.co . Также ограничивает бесплатное использование 1000 запросов в сутки .

freegeoip.net

Сервис, предлагающий открытый HTTP и HTTPS API, позволяющий получить информацию в форматах CSV, XML или JSON.

Сервис также поддеживает JSONP:

$.getJSON ("https://freegeoip.net/json/?callback=" , function (response) { $("body" ) .text (response.country_name ) ; } } ) ;

$.getJSON("https://freegeoip.net/json/?callback=", function (response) { $("body").text(response.country_name); } });

Возвращаемые параметры:

"ip" - непосредственно IP адрес
"country_code" - двухбуквенный код страны
"country_name" - название страны на английском языке
"region_code" - код региона
"region_name" - название региона
"city" - город
"zip_code" - почтовый код (США)
"time_zone" - временная зона
"latitude"- широта
"longitude" - долгота
"metro_code" - метро

Вместо выводов

По результатам наблюдений все приведенные сервисы (кроме MaxMind, который в испытаниях не участвовал, и вообще приведен в статье лишь для полноты картины) правильно определили страну и код страны, geoPlugin сумел правильно определить валюту. Только сервис ipinfo правильно определил область, но промахнулся с городом, а ни один другой сервис город и область не определили совсем (вернули null, 0 или пустое значение).

От автора: в интернете ваше имя и фамилия ничего не значат. Здесь для определения юзера используется 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-коду) можно реализовать редиректы на различные страницы сайта:

← Вернуться

×
Вступай в сообщество «allcorp24.ru»!
ВКонтакте:
Я уже подписан на сообщество «allcorp24.ru»