Использование локальных баз MaxMind в GeoIp Bitrix для высокой точности
Стандартные GeoIP-обработчики в 1С-Битрикс часто полагаются на внешние HTTP-сервисы, что вносит задержки в генерацию страницы и создает риски из-за блокировок API. Для проектов, ориентированных на высокую производительность, оптимальным решением является использование локального бинарного файла. Отечественного, к сожалению, актуального не нашёл, но MaxMind со своей бинарной БД (.mmdb) вполне подходит.
Контекст и проблема
При использовании облачных GeoIP-сервисов каждый запрос к сайту может инициировать внешнее соединение, что увеличивает TTFB (Time to First Byte). Кроме того, сторонние API могут быть ограничены для запросов из определенных регионов. Использование локальной базы данных позволяет обрабатывать запросы на стороне сервера со скоростью чтения из памяти, обеспечивая при этом актуальность данных для российских IP-адресов (но проверяйте страну для новых регионов, т.к. MaxMind - зарубежный сервис).
Решение
Для реализации необходимо скачать базу данных (например, бесплатную GeoLite2 City) в формате .mmdb и разместить её на сервере. В административной панели (Настройки -> Настройки продукта -> Геолокация) нужно активировать обработчик «MaxMind (бинарный файл)» и указать путь к файлу. Для скачивания БД с официального сайта MaxMind потребуется регистрация - она бесплатна, но можно поискать зеркала.
Программное взаимодействие осуществляется через Bitrix\Main\Service\GeoIp\Manager. Рекомендуется явно проверять наличие данных на русском языке, так как базы MaxMind по умолчанию содержат мультиязычные записи.
declare(strict_types=1);
namespace Local\Services;
use Bitrix\Main\Service\GeoIp\Manager;
use Bitrix\Main\Service\GeoIp\MaxMind;
use Bitrix\Main\Error;
final class GeoService
{
/**
* Получает детальную информацию о местоположении через локальный MaxMind
*/
static public function getCityInfo(string $ip = ''): ?array
{
if ($ip === '') {
$ip = Manager::getRealIp();
}
// Можно принудительно использовать только локальный обработчик MaxMind
// Класс обработчика: \Bitrix\Main\Service\GeoIp\GeoIP2
// Важно не использовать здесь конструкцию \Bitrix\Main\Service\GeoIp\GeoIP2::class
// т.к. она генерирует строку без ведущего слеша Bitrix\Main\Service\GeoIp\GeoIP2 , а в методе
// getHandlerByClassName() проверка идёт строго с ведущим (facepalm)
$handler = Manager::getHandlerByClassName('\\Bitrix\\Main\\Service\\GeoIp\\GeoIP2');
if (!$handler || !$handler->isActive()) {
return null;
}
// Запрашиваем данные с приоритетом на русском языке
$result = $handler->getDataResult($ip, 'ru');
if ($result && $result->isSuccess()) {
$geoData = $result->getGeoData();
return [
'CITY' => $geoData->cityName,
'REGION_CODE' => $geoData->regionCode,
'COUNTRY' => $geoData->countryName,
'IS_IN_RF' => ($geoData->countryCode === 'RU'),
];
}
return null;
}
}
// Пример вызова сервиса для получения данных о геолокации
/*
$geoData = GeoService::getCityInfo();
if ($geoData) {
echo "Ваш город: " . $geoData['CITY'];
}
*/
/local/share/geoip/.Итог
Использование локального MaxMind через интерфейс GeoIp\Manager — это "золотой стандарт" для Битрикс-разработки. Вы получаете максимальную скорость работы, отсутствие внешних зависимостей и полную совместимость с ядром D7.