foroco/php-browser-detection

用于通过 User-Agent 解析检测浏览器、操作系统(OS)、平台和设备类型的超快速 PHP 库

v2.8 2024-09-03 14:39 UTC

This package is auto-updated.

Last update: 2024-09-03 14:42:19 UTC


README

这是一个 PHP 库,通过 User-Agent 解析检测浏览器、操作系统(OS)、平台和设备类型,设计时注重高性能和最小化 HTTP 客户端解析时的内存使用。
它使用简单而快速的算法,准确识别超过 200 个浏览器/应用和 60 多个操作系统。
解析最常用的浏览器不到 0.0005 秒,即使在低端共享主机环境下也是如此。对于罕见的 User-Agent,在相同的托管条件下,识别时间不到 0.0008 秒。
该库专门针对当前浏览器和 OS 进行调整,省略了对不再使用的旧环境的支持。
该库通过单个文件操作,不依赖任何第三方依赖。

要求

此库需要 PHP 5.3 或更高版本。

手动安装

  1. 只需将库文件 BrowserDetection.php(位于 src 目录中)上传到您的项目中;
  2. 使用 require_once 包含 PHP 库文件
<?php

require_once('BrowserDetection.php');

?>

使用 Composer 安装

使用 Composer 安装此库

composer require foroco/php-browser-detection

通过运行命令更新库包

composer update foroco/php-browser-detection

第一步需要 Composer 自动加载器

<?php

require ('vendor/autoload.php');

// If you use PHP in Windows OS use another path style:
// require ('vendor\autoload.php');
?>

用法

该库尝试从 HTTP 客户端发送的 HTTP_USER_AGENT 标头中检索环境数据。
在此库中,PHP 类 BrowserDetection 提供了四个公共方法,返回从 HTTP_USER_AGENT 提取的检测数据的数组或 JSON 字符串。

  • getAll();
  • getOS();
  • getBrowser();
  • getDevice();

第一个参数应包含来自 HTTP_USER_AGENT 标头的 User-Agent 字符串或您的自定义 User-Agent 字符串。
第二个参数(可选)可能包含 'JSON',如果您希望以 JSON 格式获取返回结果。

<?php

$Browser = new foroco\BrowserDetection();

$useragent = $_SERVER['HTTP_USER_AGENT'];

// Get all possible environment data (array):
$result = $Browser->getAll($useragent);

// Get OS data (array):
$result = $Browser->getOS($useragent);

// Get Browser data (array):
$result = $Browser->getBrowser($useragent);

// Get Device type data (array):
$result = $Browser->getDevice($useragent);

/*
Also methods may returned result as JSON string
Just use second argument of methods as 'JSON'
*/

// Get all possible environment data (JSON):
$result = $Browser->getAll($useragent, 'JSON');

print_r($result);

// ... etc
?>

该库类 BrowserDetection 还包含特殊方法 setTouchSupport()(可选,从版本 1.1 开始可用)。
此方法对于检测在 Desktop Mode 条件下的移动浏览器(Android 和 iOS)是必要的。
对于 Desktop Mode 检测,如果浏览器支持触摸事件,则应调用 setTouchSupport() 方法。
触摸事件检测由目标浏览器中的客户端 JavaScript 代码执行。示例

if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
// Touch Event detected
}

返回变量的说明

OS 类型os_type
返回操作系统(OS)的类型。
所有可能的值

  • 桌面
  • 移动
  • 混合
  • 未知

OS 系列os_family
返回操作系统(OS)系列或无法识别 OS 系列时返回 unknown
示例: windowslinuxunix 等。

OS 名称os_name
返回操作系统(OS)名称或无法识别 OS 名称时返回 unknown
示例: WindowsAndroidmacOSiOS 等。

OS 版本os_version
返回操作系统(OS)版本或无法识别 OS 版本时返回 0
可能包含数字、字符串或混合类型的 OS 版本。
对于数字 OS 版本(例如 Android),包含主版本和次要版本部分值,例如 4.48.11014 等。
对于字符串 OS 版本(例如 macOS),包含字符串版本名称值,例如 MavericksMojaveCatalinaBig Sur 等。
对于Windows可能包含混合版本类型的值:10VistaXP等。

操作系统标题 (os_title)
返回包含操作系统名称和版本的操作系统的标题。
如果未识别操作系统名称,也返回unknown

设备类型 (device_type)
基于一些用户代理数据返回设备类型。
所有可能的值

  • 桌面
  • 移动
  • tv
  • 控制台
  • 媒体播放器
  • 汽车
  • 手表
  • 未知

浏览器名称 (browser_name)
返回浏览器名称或无法识别浏览器名称时返回unknown
例如:ChromeFirefoxUC浏览器华为浏览器Vivaldi等。

浏览器版本 (browser_version)
返回浏览器版本号或无法识别浏览器版本时返回0
始终包含数字值(整数或浮点数)。
对于一些应包含主版本和次要版本部分的浏览器(例如SafariVivaldiPaleMoon等),返回浮点数(例如3.510.513.1)。
对于其他具有许多主版本的浏览器(例如ChromeFirefoxOpera等),返回仅主十进制浏览器版本(例如1537128)。

浏览器标题 (browser_title)
返回包含浏览器名称和浏览器版本的浏览器标题。
如果未识别浏览器名称,也返回unknown

原始Chrome浏览器 (browser_chrome_original)
如果浏览器被识别为原始Google Chrome浏览器,则返回1数字,否则返回0

原始Firefox浏览器 (browser_firefox_original)
如果浏览器被识别为原始Mozilla Firefox浏览器,则返回1数字,否则返回0

原始Safari浏览器 (browser_safari_original)
如果浏览器被识别为原始Apple Safari浏览器,则返回1数字,否则返回0

Chromium浏览器版本 (browser_chromium_version)
如果浏览器基于Chromium引擎,则返回Chromium主引擎版本号,否则返回0

Gecko浏览器版本 (browser_gecko_version)
如果浏览器基于Gecko引擎,则返回Gecko主引擎版本号,否则返回0

WebKit浏览器版本 (browser_webkit_version)
如果浏览器基于WebKit引擎,则返回WebKit版本引擎号,否则返回0
始终为浮点数值。

Android Webview浏览器 (browser_android_webview)
如果检测到Android Webview模式,则返回1数字,否则返回0

iOS Webview浏览器 (browser_ios_webview)
如果检测到iOS Webview模式,则返回1数字,否则返回0

桌面模式 (browser_desktop_mode)
如果移动浏览器在桌面模式下运行,则返回1数字,否则如果未检测到则返回0
如果浏览器支持触摸事件,则应调用setTouchSupport()方法以检测桌面模式

64位模式 (64bits_mode)
如果操作系统(OS)和浏览器以64位模式一起工作,则返回1数字,否则如果未检测到64位模式则返回0
仅适用于getAll();getOS();方法。

用法示例

以下是一些示例,以帮助您了解库的使用场景。

检测所有

要检测所有可能的环境数据,请使用

<?php

$Browser = new foroco\BrowserDetection();

$useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.4150.0 Iron Safari/537.36';
$result = $Browser->getAll($useragent);
print_r($result);

?>

返回

Array
(
    [os_type] => desktop
    [os_family] => windows
    [os_name] => Windows
    [os_version] => 7
    [os_title] => Windows 7
    [device_type] => desktop
    [browser_name] => Iron
    [browser_version] => 80
    [browser_title] => Iron 80
    [browser_chrome_original] => 0
    [browser_firefox_original] => 0
    [browser_safari_original] => 0
    [browser_chromium_version] => 80
    [browser_gecko_version] => 0
    [browser_webkit_version] => 0
    [browser_android_webview] => 0
    [browser_ios_webview] => 0
    [browser_desktop_mode] => 0
    [64bits_mode] => 1
)

操作系统检测

要仅解析操作系统数据,请使用

<?php

$Browser = new foroco\BrowserDetection();

$useragent = 'Mozilla/5.0 (Linux; arm_64; Android 14; SM-G965F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.99 YaBrowser/24.7.4.147 Mobile Safari/537.36';
$result = $Browser->getOS($useragent);
print_r($result);

?>

返回

Array
(
    [os_type] => mobile
    [os_family] => android
    [os_name] => Android
    [os_version] => 14
    [os_title] => Android 14
    [64bits_mode] => 1
)

浏览器检测

要仅解析浏览器数据,请使用

<?php

$Browser = new foroco\BrowserDetection();

$useragent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/128.0.6613.98 Mobile/15E148 Safari/604.1';
$result = $Browser->getBrowser($useragent);
print_r($result);

?>

返回

Array
(
    [browser_name] => Chrome
    [browser_version] => 128
    [browser_title] => Chrome 128
    [browser_chrome_original] => 1
    [browser_firefox_original] => 0
    [browser_safari_original] => 0
    [browser_chromium_version] => 128
    [browser_gecko_version] => 0
    [browser_webkit_version] => 0
    [browser_android_webview] => 0
    [browser_ios_webview] => 0
    [browser_desktop_mode] => 0
)

设备检测

要仅解析设备类型数据,请使用

<?php

$Browser = new foroco\BrowserDetection();

$useragent = 'Mozilla/5.0 (SMART-TV; Linux; Tizen 5.0) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/2.2 Chrome/63.0.3239.84 TV Safari/537.36';
$result = $Browser->getDevice($useragent);
print_r($result);

?>

返回

Array
(
    [device_type] => tv
)

桌面模式检测

要检测移动浏览器是否在桌面模式下运行,请使用

<?php

$Browser = new foroco\BrowserDetection();

$useragent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36';
$Browser->setTouchSupport(); // Call if Touch events detected in browser by JavaScript code ('ontouchstart' in window)
$result = $Browser->getAll($useragent);
print_r($result);

?>

返回

Array
(
    [os_type] => mobile
    [os_family] => android
    [os_name] => Android
    [os_version] => 0
    [os_title] => Android
    [device_type] => mobile
    [browser_name] => Chrome
    [browser_version] => 128
    [browser_title] => Chrome 128
    [browser_chrome_original] => 1
    [browser_firefox_original] => 0
    [browser_safari_original] => 0
    [browser_chromium_version] => 128
    [browser_gecko_version] => 0
    [browser_webkit_version] => 0
    [browser_android_webview] => 0
    [browser_ios_webview] => 0
    [browser_desktop_mode] => 1
    [64bits_mode] => 0
)

检测所有(JSON)

要解析所有可能的环境数据并返回JSON格式字符串,请使用

<?php

$Browser = new foroco\BrowserDetection();

$useragent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36';
$result = $Browser->getAll($useragent, 'JSON');
print_r($result);

?>

返回

{"os_type":"mobile","os_family":"macintosh","os_name":"iOS","os_version":6,"os_title":"iOS 6","device_type":"mobile","browser_name":"Chrome","browser_version":78,"browser_title":"Chrome 78","browser_chrome_original":1,"browser_firefox_original":0,"browser_safari_original":0,"browser_chromium_version":78,"browser_gecko_version":0,"browser_webkit_version":0,"browser_android_webview":0,"browser_ios_webview":0,"browser_desktop_mode":0,"64bits_mode":0}

基准测试

在低级共享主机环境中进行了基准测试。
测试服务器配置:RedHat Linux + LiteSpeed + PHP 扩展。
测试条件基于收集的约 446000 个不重复的真实用户代理字符串。

PHP 7.3 中的用户代理识别性能(每秒请求次数)

getAll: ~ 31000 rps
getOS: ~ 120000 rps
getBrowser: ~ 43000 rps
getDevice: ~ 70000 rps

重要提示

不幸的是,主要浏览器引擎已“冻结”了用户代理头中的操作系统版本信息。
例如,在 macOS 上,用户代理中的操作系统版本信息在 “冻结”macOS Big Sur 版本级别(Mac OS X 10_15_7)。
在 Windows 上,操作系统版本信息在用户代理中 “冻结”Windows 10 版本级别(Windows NT 10.0)。

近期发布的基于 WebKit、Chromium 和 Gecko 的浏览器的版本不再在用户代理头中包含正确的当前操作系统版本信息。

参考:

https://issues.chromium.org/issues/40167872
https://bugzilla.mozilla.org/show_bug.cgi?id=1679929
https://bugs.webkit.org/show_bug.cgi?id=217364

一种方法是使用 HTTP 客户端提示头,特别是 Sec-CH-UA-Platform-Version 头。然而,需要注意的是,目前只有基于 Chromium 的浏览器支持发送客户端提示头。

许可证

MIT 许可证(MIT)

版权所有(c)2020-2024 Artem Murugov

本许可证授予任何获得本软件及其相关文档副本(以下简称“软件”)的人免费使用权,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许获得软件的人进行上述操作,前提是遵守以下条件

上述版权声明和本许可证声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类索赔、损害或其他责任是基于合同、侵权或其他法律依据,以及与软件或其使用或其他交易有关。