Как PHP помогает узнать, какой браузер использует посетитель
Определение браузера пользователя - одна из задач при анализе клиентской среды, логировании или адаптации контента. На сервере PHP для этого чаще всего используют строку User-Agent, передаваемую в HTTP-запросе. Однако существуют и другие подходы, позволяющие повысить точность или получить больше данных. Рассмотрим основные варианты, их цели и ограничения.
Основные подходы к установлению браузера
Какой метод является наиболее надежным для повседневных задач?
Самый распространённый и простой способ - разобрать строку HTTP_USER_AGENT с помощью встроенной функции get_browser(). Она обращается к файлу browscap.ini, который содержит обновляемую базу сигнатур браузеров. При правильной настройке этот метод даёт структурированную информацию: название, версию, платформу, поддержку фреймов, JavaScript и т.д.
// Пример использования get_browser()
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
$browser = get_browser($ua, true);
print_r($browser);
Php браузер пользователя (определение браузера пользователя на php)
Результат может выглядеть так:
Array
(
[browser] => Chrome
[version] => 114.0
[platform] => Windows
[mobile] =>
[cookies] => 1
[javascript] => 1
...
)
Основная сложность - файл browscap.ini должен быть загружен и подключён в php.ini (директива browscap). Если его нет, функция возвращает false. Решение: скачать актуальную версию с browscap.org или воспользоваться альтернативой - библиотекой browscap/browscap-php, которая не требует изменений в конфигурации сервера.
Что делать, если get_browser() недоступен или нужна гибкость?
Можно написать функцию самостоятельного разбора строки User-Agent с помощью регулярных выражений или простого поиска характерных подстрок. Это полезно, когда нужно быстро определить только тип браузера (Chrome, Firefox, Safari, Edge и т.п.) без полной базы.
// Пример самодельной функции
function detectBrowserSimple($ua) {
if (stripos($ua, 'Edg') !== false) return 'Edge';
if (stripos($ua, 'OPR') !== false) return 'Opera';
if (stripos($ua, 'Chrome') !== false) return 'Chrome';
if (stripos($ua, 'Firefox') !== false) return 'Firefox';
if (stripos($ua, 'Safari') !== false) return 'Safari';
return 'Unknown';
}
echo detectBrowserSimple($_SERVER['HTTP_USER_AGENT']);
Ошибка: многие браузеры (например, Chrome, Edge, Opera) содержат слово 'Chrome' одновременно, поэтому порядок проверок имеет значение. Рекомендуется сначала проверять более специфичные строки. Также важно обрабатывать версии для мобильных устройств.
Как получить более точные данные без обновления browscap.ini?
Использовать сторонние библиотеки, такие как Matomo Device Detector (бывший Browscap). Она не требует файла ini и обновляется через Composer. Выдаёт информацию о браузере, операционной системе, устройстве.
// Установка: composer require matomo/device-detector
require 'vendor/autoload.php';
use DeviceDetector\DeviceDetector;
$dd = new DeviceDetector($_SERVER['HTTP_USER_AGENT']);
$dd->parse();
$browser = $dd->getClient('browser');
echo $browser['name'] . ' ' . $browser['version'];
// Вывод: Chrome 114.0
Проблема: библиотека может не определять редкие браузеры или новые версии сразу после релиза. Решение - регулярно обновлять её через composer update и при необходимости добавлять кастомные правила.
Что если нужно определить браузер только на стороне клиента и передать данные на сервер?
Использовать JavaScript для снятия информации об агенте, платформе и даже разрешении экрана и отправить через AJAX или скрытое поле формы. На сервере PHP принимает эти данные в POST или GET.
// JavaScript (в браузере)
var ua = navigator.userAgent;
var plat = navigator.platform;
var xhr = new XMLHttpRequest();
xhr.open('POST', 'save_browser.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('ua=' + encodeURIComponent(ua) + '&platform=' + encodeURIComponent(plat));
// PHP (save_browser.php)
$ua = $_POST['ua'] ?? '';
$platform = $_POST['platform'] ?? '';
// Далее можно анализировать $ua так же, как и обычный User-Agent
Недостаток: метод требует JavaScript, поэтому не сработает для ботов или пользователей с отключённым JS. Кроме того, данные можно подделать на стороне клиента.
Как определить браузер для мобильных устройств отдельно?
В современных библиотеках (Matomo, Browscap) уже есть флаг mobile. Если нужна простая проверка - проверяем наличие характерных слов ('Android', 'iPhone', 'iPad') в User-Agent.
function isMobile($ua) {
$patterns = ['/Mobile/i', '/Android/i', '/iPad/i', '/iPhone/i'];
foreach ($patterns as $p) {
if (preg_match($p, $ua)) return true;
}
return false;
}
Не все мобильные браузеры содержат слово 'Mobile' (например, Chrome на Android часто содержит 'Mobile', но некоторые планшеты могут не содержать). Лучше использовать полноценный детектор устройств.
Детальные примеры кода для разных сценариев
Расширим базовые примеры, добавив обработку частных случаев и вывод результата.
Пример 1: Получение полной информации через get_browser() с подготовкой файла browscap
Скачиваем файл browscap.ini (например, в /home/user/browscap.ini). Настраиваем php.ini:
browscap = /home/user/browscap.ini
После перезапуска веб-сервера используем функцию:
$ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.199 Safari/537.36';
$info = get_browser($ua, true);
echo htmlspecialchars(var_export($info, true));
array ( 'browser' => 'Chrome', 'version' => '114.0', 'majorver' => '114', 'minorver' => '0', 'platform' => 'Windows', 'platform_version' => '10.0', 'ismobiledevice' => false, 'istablet' => false, 'cookies' => true, 'javascript' => true, 'cssversion' => '3', 'frames' => true, 'javaapplets' => true, ... )
Если нет доступа к php.ini, можно использовать browscap-php из Composer:
composer require browscap/browscap-php
# Затем в коде:
$browscap = new Browscap\Browscap('/path/to/cache');
$info = $browscap->getBrowser($ua, true);
Пример 2: Самодельный детектор с поддержкой версий
Функция, которая извлекает название браузера, его версию и платформу через регулярные выражения:
function parseUserAgent($ua) {
$result = array('browser' => 'Unknown', 'version' => '', 'platform' => 'Unknown');
if (preg_match('/Firefox\/([\d.]+)/i', $ua, $m)) {
$result['browser'] = 'Firefox';
$result['version'] = $m[1];
} elseif (preg_match('/Edg(?:e)?\/([\d.]+)/i', $ua, $m)) {
$result['browser'] = 'Edge';
$result['version'] = $m[1];
} elseif (preg_match('/OPR\/([\d.]+)/i', $ua, $m)) {
$result['browser'] = 'Opera';
$result['version'] = $m[1];
} elseif (preg_match('/Chrome\/([\d.]+)/i', $ua, $m)) {
$result['browser'] = 'Chrome';
$result['version'] = $m[1];
} elseif (preg_match('/Safari\/([\d.]+)/i', $ua, $m)) {
$result['browser'] = 'Safari';
$result['version'] = $m[1];
}
if (preg_match('/Windows NT (\d+\.\d+)/i', $ua, $m)) {
$result['platform'] = 'Windows ' . $m[1];
} elseif (preg_match('/Mac OS X (\S+)/i', $ua, $m)) {
$result['platform'] = 'macOS ' . str_replace('_', '.', $m[1]);
} elseif (preg_match('/Linux/i', $ua)) {
$result['platform'] = 'Linux';
}
return $result;
}
print_r(parseUserAgent($_SERVER['HTTP_USER_AGENT']));
Array
(
[browser] => Chrome
[version] => 114.0.5735.199
[platform] => Windows 10.0
)
Проблема: версия может включать много чисел, не все части нужны. В примере выше можно ограничиться мажорной и минорной версией. Также регулярка для Safari может ложно срабатывать на других браузерах - нужно проверять отсутствие 'Chrome'.
Пример 3: Использование Matomo Device Detector для мобильных и десктопных браузеров
require 'vendor/autoload.php';
use DeviceDetector\DeviceDetector;
$ua = 'Mozilla/5.0 (Linux; Android 13; SM-S908B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 Mobile Safari/537.36';
$dd = new DeviceDetector($ua);
$dd->parse();
$os = $dd->getOs();
$client = $dd->getClient();
echo 'Браузер: ' . $client['name'] . ' ' . $client['version'] . "\n";
echo 'ОС: ' . $os['name'] . ' ' . $os['version'] . "\n";
echo 'Мобильное устройство: ' . ($dd->isMobile() ? 'Да' : 'Нет') . "\n";
echo 'Планшет: ' . ($dd->isTablet() ? 'Да' : 'Нет') . "\n";
Браузер: Chrome 114.0.5735.196 ОС: Android 13 Мобильное устройство: Да Планшет: Нет
Если версия библиотеки устарела, могут выдаваться пустые массивы. Решение - регулярно обновлять её через composer update.
Пример 4: Сохранение данных о браузере в базу данных
// Предположим, используем Matomo Device Detector
$detect = new DeviceDetector($ua);
$detect->parse();
$stmt = $pdo->prepare('INSERT INTO log (user_agent, browser, version, os, mobile, visited_at) VALUES (?, ?, ?, ?, ?, NOW())');
$stmt->execute([
$ua,
$detect->getClient('name'),
$detect->getClient('version'),
$detect->getOs('name') . ' ' . $detect->getOs('version'),
$detect->isMobile() ? 1 : 0
]);