GeoIP

Определение географического положения по IP. Использует базу ipgeobase.ru
Метки: IP-адрес

Документация

Читать

Основой механизма геотаргетирования на сайте являются данные о местоположении пользователя, т.е. необходимо знать, откуда он приходит. Обычно данную информацию получают на основе IP-адреса. Для этих целей был реализован компонент GeoIP, позволяющий определять местоположение (страну, регион, город) посетителей по IP-адресу.

При работе компонент не использует внешние сервисы, при инициализации базы скачиваются с сайта ipgeobase.ru.

Настройка компонента

Компонент устанавливается стандартным образом из библиотеки. При этом базы остаются пустыми, их нужно скачивать. Это можно сделать из командной строки CLI-командой geoip_update:

cd /path/to/site/www
php index.php geoip_update

Запустится процесс обновления данных. Он может занять некоторое время (при тестировании результат показал от 10 минут до получаса). По окончании обновления можно протестировать с помощью команды geoip, указав IP-адрес.

php index.php geoip 109.195.177.171

Ответ будет примерно таким:

IP: 109.195.177.171
Country: RU (1)
District: Центральный федеральный округ (1)
Region: Тульская область (71)
City: Тула (2656)

После этого рекомендуется настроить cron на периодическое обновление. Например,

30 1 20 * * cd /путь/www/; /usr/local/bin/php ./index.php geoip_update

Во время обновления баз система полностью сохраняет работоспособность. До того, как обновление закончится, продолжают работать старые базы. Но тем не менее, рекомендуется обновления делать ночью, во избежание излишней нагрузки на сервер.

Использование

Для получения информации необходимо воспользоваться статическим методом Component_GeoIP::info($ip), который возвращает экземпляр класса Component_GeoIP_Info. Если метод возвращает false, то это означает, что такого адреса в базе не обнаружено.

// Получаем информацию
$info = Component_GeoIP::info($ip);
// Если адрес найден, то рассматриваем дальше
if ($info) {
	// Получаем страну.
	// Если адрес есть в базе, то информация по стране есть обязательно.
	$country = $info->country();
  	// Получаем идентификатор страны
  	$country_id = $country->id;
  	// Получаем название страны
  	$country_title = $country->title;

  	// Получаем город
  	$city = $info->city();
	// Проверяем, есть ли информация по городу
  	// т.к. для многих адресов есть информация только по стране
  	if ($city) {
    		// Идентификатор и название города
    		$city_id = $city->id;
    		$city_title = $city->title;

		// По городу еще есть географические координаты
    		$latitude = $city->latitude;
    		$longitude = $city->longitude;

    		// Получаем регион и округ
    		// Их идентификаторы и названия - аналогично городу и стране
    		$region = $info->region();
    		$district = $info->district();
  	}
}

В настоящий момент в базе присутствует информация о городах для адресов России и Украины. По остальным указана только страна.

Хранение и использование данных из другой базы

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

Для этого достаточно в конфигурации компонента указать имя базы:

// app/config/modules.php

return array(
	...
	'Component.GeoIP' => array(
    		'dbname' => 'db_geo',
  		),
	),
);

Если не работает обновление базы

Такая проблема возникает, когда на хостинге не установлены расширения PHP для работы с CURL и ZIP-архивами. Если вопрос только с CURL, то можно организовать скачивание архива другими способами (например wget отдельным вызовом до запуска PHP-скрипта), а в конфигурации указать другое местонахождение архива (по умолчанию - geo_files.zip).

// app/config/modules.php

return array(
	...
	'Component.GeoIP' => array(
	    	'ipgeobase_url' => '/home/path/to/files/geo_files.zip',
  		),
	),
);

Если же дело в невозможности открыть ZIP-архив средствами PHP, то необходимо указывать пути уже непосредственно к двум файлам из вышеуказанного архива. При этом параметр ipgeobase_url необходимо установить в false, чтобы скрипт не пытался скачивать ZIP-архив или просто обратиться к нему.

// app/config/modules.php

return array(
	...
	'Component.GeoIP' => array(
		'ipgeobase_url' => false,
		'file_ips' => '/home/path/to/files/cidr_optim.txt',
		'file_cities' => '/home/path/to/files/cities.txt',
  		),
	),
);

Список всех настроек конфигурации

  • ipgeobase_url - url для скачивания ZIP-архива. По умолчанию http://ipgeobase.ru/files/db/Main/geo_files.zip.
  • zip_file - адрес к ZIP-архиву. По умолчанию false.
  • file_ips - путь к файлу с ip в архиве. По умолчанию false.
  • file_cities - путь к файлу со списком городов в архиве. По умолчанию false.
  • dbname - имя базы данных на стороне, где хранятся гео-данные. По умолчанию false.

Если сайт на устаревших или других движках

Основная задача - получить доступ к базе данных с гео-информацией. Каким образом это сделать - остается на усмотрение каждого разработчика.

А если доступ есть, то гео-информация получается элементарными операциями:

function get_geoip_info($ip)
{
	$ip = ip2long($ip);
  	$result = mysql_query("SELECT * FROM geoip_ip WHERE {$ip}>=i1 AND {$ip}<=i2");
  	return mysql_fetch_assoc($result);
}

Все версии

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


Версия Дата
1.2.0 07.08.2018
1.1.2
Изменения
DB.IP: поиск ip одним sql-запросом
15.06.2017
1.1.1
Изменения
Исправлена проблема отрицательных чисел, возникающих из-за нехватки разрядности Int.
08.06.2017
1.1.0 01.11.2013
1.0.0 09.10.2013