Получение информации об интернет-браузере пользователя
Определение браузера пользователя: обзор подходов
Для адаптации контента, сбора статистики или отладки веб-приложений часто требуется узнать, какой браузер использует посетитель. В 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.