Получение информации об интернет-браузере пользователя

Раздел: Работа с окружением PHP -> Серверные переменные: дата, IP, URL, версия

Определение браузера пользователя: обзор подходов

Для адаптации контента, сбора статистики или отладки веб-приложений часто требуется узнать, какой браузер использует посетитель. В PHP это можно сделать несколькими способами, от простого анализа строки User-Agent до профессиональных библиотек. Ниже рассматриваются основные варианты, их сильные и слабые стороны.

Как получить точные данные о браузере с помощью browscap?

Наиболее полное и структурированное решение - использование функции get_browser(), которая возвращает объект с информацией о браузере, версии, платформе и возможностях. Для её работы требуется указать путь к файлу browscap.ini в php.ini или через ini_set().


// Установка пути к browscap.ini (например, локальная копия с https://browscap.org/)
ini_set('browscap', '/path/to/php_browscap.ini');

$browser = get_browser(null, true);
print_r($browser);
  

Php получить браузер (получить браузер пользователя в php)

В результате вы получите массив с ключами: browser, version, platform, ismobile и другими. Этот метод подходит, когда важна высокая точность и доступ к обновлённой базе User-Agent.

Проблемы: файл browscap.ini нужно регулярно обновлять, иначе данные устаревают. На многих хостингах функция может быть отключена. Кроме того, производительность страдает при каждом вызове, если файл большой. Решение - кешировать результат или использовать библиотеки.

Как определить браузер из строки User-Agent без дополнительных настроек?

Самый простой вариант - извлечь значение из глобальной переменной $_SERVER['HTTP_USER_AGENT'] и с помощью регулярных выражений или простых строковых функций определить браузер. Этот способ не требует внешних зависимостей, но даёт только базовую информацию.


$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';

if (strpos($ua, 'Firefox') !== false) {
    $browser = 'Firefox';
} elseif (strpos($ua, 'Chrome') !== false) {
    $browser = 'Chrome';
} elseif (strpos($ua, 'Safari') !== false) {
    $browser = 'Safari';
} elseif (strpos($ua, 'Edge') !== false) {
    $browser = 'Edge';
} elseif (strpos($ua, 'MSIE') !== false || strpos($ua, 'Trident') !== false) {
    $browser = 'Internet Explorer';
} else {
    $browser = 'Неизвестный';
}
echo "Браузер: $browser";
  

Подход пригоден для грубой фильтрации, когда не нужны детали (версия, платформа). Однако User-Agent легко подделывается, а некоторые браузеры могут содержать подстроки других браузеров (например, Chrome в Edge).

Типичные ошибки: пустое значение User-Agent (боты, curl без заголовка) или неожиданный формат. Рекомендуется всегда проверять переменную на существование и задавать значение по умолчанию.

Какая библиотека позволяет надёжно распознавать браузер без browscap?

Для точного анализа User-Agent без ручной настройки browscap удобно использовать пакет whichbrowser/parser (устанавливается через Composer). Он парсит строку и возвращает объект с детальной информацией: название браузера, версия, движок, тип устройства, операционная система.


require 'vendor/autoload.php';

use WhichBrowser\Parser;

$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
$result = new Parser($ua);

echo "Браузер: " . $result->browser->name . "\n";
echo "Версия: " . $result->browser->version . "\n";
echo "Платформа: " . $result->os->name . "\n";
echo "Тип: " . $result->device->type . "\n";
  

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

Проблемы: установка через Composer требует доступа к репозиториям, а также увеличивает размер приложения. Для простых задач избыточно. Также возможны проблемы с кодировкой, если User-Agent содержит нестандартные символы.

Как определить мобильное устройство и связанный браузер?

Для выделения мобильных браузеров и устройств часто применяется библиотека mobiledetect/mobiledetect. Она не только определяет мобильность, но и явно выдаёт название браузера и версию.


require 'vendor/autoload.php';

use Detection\MobileDetect;

$detect = new MobileDetect();

if ($detect->isMobile()) {
    echo "Это мобильное устройство.\n";
}
// Определение браузера (доступны методы detectBrowser() и detectVersion())
$browser = $detect->detectBrowser();
echo "Браузер: " . ($browser ?: 'не удалось определить') . "\n";
  

Библиотека проста, легковесна и специализируется на мобильных сценариях. Используется, когда требуется разделить трафик на мобильный и десктопный.

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

Расширенные примеры и результаты

Пример 1. Полный разбор User-Agent с помощью WhichBrowser

Ниже приведён код, который выводит все значимые поля из объекта Parser, а также пример результата для типичного браузера Chrome на Windows.

Пример

// Код
$ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36';
$result = new Parser($ua);

echo "Browser: " . $result->browser->name . "\n";
echo "Version: " . $result->browser->version . "\n";
echo "Engine: " . $result->engine->name . " (" . $result->engine->version . ")\n";
echo "OS: " . $result->os->name . " " . $result->os->version . "\n";
echo "Device type: " . $result->device->type . "\n";
echo "Device model: " . $result->device->model . "\n";
echo "Is mobile: " . ($result->isMobile() ? 'yes' : 'no') . "\n";
Browser: Chrome
Version: 91.0.4472.124
Engine: Blink (91.0.4472.124)
OS: Windows 10 (10.0)
Device type: desktop
Device model: 
Is mobile: no

Как видно, библиотека корректно выделяет версию Chrome и операционную систему. Поле device model остаётся пустым для десктопа.

Пример 2. Разбор User-Agent вручную для извлечения версии

Иногда требуется только версия браузера. Можно обойтись простым регулярным выражением.

Пример

$ua = $_SERVER['HTTP_USER_AGENT'];
preg_match('/Chrome\/([0-9.]+)/', $ua, $matches);
if ($matches) {
    echo "Версия Chrome: " . $matches[1];
} else {
    preg_match('/Firefox\/([0-9.]+)/', $ua, $matches);
    if ($matches) {
        echo "Версия Firefox: " . $matches[1];
    } else {
        echo "Версия не определена";
    }
}
Версия Chrome: 91.0.4472.124

Этот метод быстр, но ломается при изменении формата строки (например, в Edge, где Chrome скрыт внутри Edg/).

Пример 3. Использование get_browser() с кешированием

Чтобы избежать многократного чтения browscap.ini, результат можно сохранять в сессии или в файл.

Пример

function get_cached_browser() {
    $cacheFile = sys_get_temp_dir() . '/browser_cache_' . md5($_SERVER['HTTP_USER_AGENT'] ?? '') . '.txt';
    if (file_exists($cacheFile)) {
        return unserialize(file_get_contents($cacheFile));
    }
    $browser = get_browser(null, true);
    file_put_contents($cacheFile, serialize($browser));
    return $browser;
}

$info = get_cached_browser();
echo "Браузер: " . $info['browser'] . " " . $info['version'] . "\n";
echo "Платформа: " . $info['platform'] . "\n";
echo "Мобильный: " . ($info['ismobile'] ? 'да' : 'нет');
Браузер: Chrome 91.0
Платформа: Win10
Мобильный: нет

Кеш существенно ускоряет повторные запросы того же пользователя в течение сессии, но требует очистки при изменении User-Agent.

Пример 4. Определение браузера через MobileDetect с детализацией

Библиотека MobileDetect умеет определять не только мобильность, но и конкретный браузер через методы detectBrowser() и detectVersion(). Пример с выводом версии.

Пример

$detect = new MobileDetect();
$ua = $_SERVER['HTTP_USER_AGENT'];
$browserName = $detect->detectBrowser();
$browserVersion = $detect->detectVersion();
if ($browserName && $browserVersion) {
    echo "Обнаружен браузер: $browserName $browserVersion";
} else {
    echo "Не удалось определить браузер через MobileDetect";
}
Обнаружен браузер: Chrome 91

Важно: методы работают только для браузеров, которые явно распознаются библиотекой (Chrome, Safari, Firefox и др.). Для нестандартных клиентов возвращается null.

Получить браузер пользователя в PHP - comments

En
Php получить браузер (php)