Как получить ip посетителя сайта?
Получить ip адрес посетителя можно через глобальный массив $_SERVER. Т.к. клиент может зайти на ваш сайт напрямую или же используя прокси-сервер, нам следует проверить несколько разных ключей массива $_SERVER:
- HTTP_CLIENT_IP — заголовок содержащий ip адрес пользователя (в случае прокси-сервера)
- HTTP_X_FORWARDED_FOR — заголовок содержащий ip адрес пользователя (в случае прокси-сервера)
- REMOTE_ADDR — IP-адрес, с которого пользователь просматривает текущую страницу.
Давайте напишем небольшую функцию для этого:
/**
* Возвращаем ip-адрес посетителя сайта
* @return bool|string
*/
function getUserIp() {
//Массив ключей $_SERVER которые следует проверить
$serverKeys = [
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'REMOTE_ADDR'
];
foreach ($serverKeys as $key) {
if ($_SERVER[$key]) {
//Преобразуем строку в $_SERVER в массив, получаем последний элемент массива который содержит ip-адрес
$ipAddress = trim(end(explode(',', $_SERVER[$key])));
//Проверяем переменную $ipAddress на валидность
if (filter_var($ipAddress, FILTER_VALIDATE_IP)) {
return $ipAddress;
}
}
}
//Не удалось определить ip адрес
return false;
}
//Узнаём и выводим на экран ip-адрес пользователя
$yourIp = getUserIp();
if($yourIp){
echo 'Ваш ip адрес: ' . $yourIp;
} else {
echo 'Не удалось определить ip-адрес';
}

Определяем страну и город по ip с помощью SypexGeo
SypexGeo это небольшой скрипт и несколько баз данных в бинарном формате, которые содержат огромное количество ip адресов, стран, городов и координат географических объектов. Распространяется бесплатно, работает быстро, весит не много. В первую очередь вам необходимо загрузить сам скрипт + несколько базы данных для стран и городов. Сделать это можно на странице загрузки на официальном сайта.
Первым делом вам необходимо распаковать и подключить к вашему сайту скрипт SxGeo.php.
//Подключаем SxGeo
require_once __DIR__ . '/sxgeo/SxGeo.php';
А затем, создадим экземпляр класса SxGeo и получим код страны по ip пользователя:
//Создадим объёкт SxGeo со следующими параметрами:
//$_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/sxgeo/SxGeo.dat - путь к файлу базы данных стран
//SXGEO_BATCH - пакетная обработка, увеличивает скорость обработки нескольких ip за раз
//SXGEO_MEMORY - кеширования БД в памяти
$sxGeoObj = new SxGeo($_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/sxgeo/SxGeo.dat', SXGEO_BATCH | SXGEO_MEMORY);
//Получим код страны
$countryCode = $sxGeoObj->getCountry($yourIp);
echo 'Код вашей страны: ' . $countryCode . '<br/>';
Результат:
У нас ведь есть ещё одна бинарная база SxGeoCity.dat , посмотрим что она нам даёт. Немного изменим наш код, подключим другую БД и получим всё что есть по нашему ip-адресу:
//Создадим объект SxGeo со следующими параметрами:
//$_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/sxgeo/SxGeoCity.dat - путь к файлу базы данных городов
//SXGEO_BATCH - пакетная обработка, увеличивает скорость обработки нескольких ip за раз
//SXGEO_MEMORY - кеширования БД в памяти
$sxGeoObj = new SxGeo($_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/sxgeo/SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY);
//Получим данные по городу
$city = $sxGeoObj->get($yourIp);
//Заглянем внутрь
echo '<pre>';
print_r($city);
echo '</pre>';
В результате будет выведен такой массив:
Array
(
[city] => Array
(
[id] => 501175
[lat] => 47.23135
[lon] => 39.72328
[name_ru] => Ростов-на-Дону
[name_en] => Rostov-on-Don
)
[country] => Array
(
[id] => 185
[iso] => RU
)
)
Как видите здесь есть наименование города на русском и английском языках, координаты (широта и долгота), а так же данные по стране города.
Определение города посетителя методами 1С Битрикс
Не так давно, в ядро 1С Битрикс был добавлен класс \Bitrix\Main\Service\GeoIp\Manager который позволяет нам, без подключения сторонних библиотек определить странц, город и координаты пользователя по его ip-адресу. Класс содержит следующий набор доступных методов:
Метод | Описание метода |
---|---|
getCityName | Метод возвращает полное название города. |
getCityPostCode | Метод возвращает почтовый индекс, FSA или Zip код. |
getCountryCode | Метод возвращает двухбуквенный код страны. |
getCountryName | Метод возвращает полное имя страны. |
getDataResult | Метод возвращает всю возможную информацию о геолокации. |
getGeoPosition | Метод возвращает атрибуты гео-положения. |
getGeoPositionLatitude | Метод возвращает широту. |
getGeoPositionLongitude | Метод возвращает долготу. |
getIspName | Метод возвращает имя Internet Service Provider (ISP). |
getOrganizationName | Метод возвращает название организации. |
getTimezoneName | Метод получает временную зону. |
setLogErrors | Метод включает/выключает ведение лога для выявления ошибок. |
useCookieToStoreInfo | Метод включает/выключает хранение информации о геолокации в файлах cookie. |
Давайте узнаем наименование страны, а так же город и географические координаты:
//Получим ip адрес пользователя
$yourIp = getUserIp();
echo 'Ваш ip адрес: ' . $yourIp . '<br/>';
//Передаём ip и идентификатор языка, на котором нам нужно получить название страны и города
$country = Bitrix\Main\Service\GeoIp\Manager::getCountryName($yourIp);
$cityName = Bitrix\Main\Service\GeoIp\Manager::getCityName($yourIp);
//Получаем координаты для карты
$geoPosition = Bitrix\Main\Service\GeoIp\Manager::getGeoPosition();
echo 'Ваша страна: <b>'. $country .'</b>, ваш город: <b>' . $cityName . '</b>';
echo '<pre>'; print_r($geoPosition); echo '</pre>';
Получаем такой результат:
Не нашёл где включить поддержку русского языка, поэтому название страны и города на английском, но в целом всё работает. Как мы можем это использовать? Например, можно вывести Яндекс Карту с меткой на городе посетителя и контктами магазина полученными для этого города. Их можно хранить в отдельном инфоблоке или HL-блоке. Давайте выведем карту при момощи компонента Яндекс.Карты, Настраиваемая карта:
//Получим ip адрес пользователя
$yourIp = getUserIp();
echo 'Ваш ip адрес: ' . $yourIp . '<br/>';
//Передаём ip и идентификатор языка, на котором нам нужно получить название страны и города
$country = Bitrix\Main\Service\GeoIp\Manager::getCountryName($yourIp);
//Получаем координаты для карты
$geoPosition = Bitrix\Main\Service\GeoIp\Manager::getGeoPosition();
//Параметры метки для Яндекс.Карты
$arPlacemarks[] = [
"LAT" => $geoPosition['latitude'],
"LON" => $geoPosition['longitude'],
"TEXT" => $userCity,
];
//Параметры карты в виде сериализованного массива
$mapData = serialize([
'yandex_scale' => 5, //Масштаб карты
'yandex_lat' => $geoPosition['latitude'], //Координаты
'yandex_lon' => $geoPosition['longitude'], //Координаты
'PLACEMARKS' => $arPlacemarks
]);
//Компонент Яндекс.Карты, Настраиваемая карта
$APPLICATION->IncludeComponent(
"bitrix:map.yandex.view",
"",
Array(
"API_KEY" => "",
"CONTROLS" => array("ZOOM", "MINIMAP", "TYPECONTROL", "SCALELINE"),
"INIT_MAP_TYPE" => "MAP",
"MAP_DATA" => $mapData ,
"MAP_HEIGHT" => "500",
"MAP_ID" => "",
"MAP_WIDTH" => "600",
"OPTIONS" => array("ENABLE_SCROLL_ZOOM", "ENABLE_DBLCLICK_ZOOM", "ENABLE_DRAGGING")
)
);
Получаем такой результат:
Как видите в 1С Битрикс вы без особых сложностей и сторонних библиотек можете получить все данные о местоположении пользователя по его ip адресу и реализовать на основе этих данных некий персонализированный функционал, например поменять телефоны на сайте, чтобы посетитель дозванивался до регионального офиса, вывести контакты регионального офиса на странице контактов, вывести цены текущего региона пользователя и многое другое. О реализации подобного функционала поговорим в других статьях.
Функции использованные в статье: trim(), end(), explode()