lukasznowicki/php-browser-detection

一款超快速PHP库,通过解析User-Agent来检测浏览器、操作系统、平台和设备类型。

v2.0 2021-03-23 20:55 UTC

This package is auto-updated.

Last update: 2024-09-29 05:56:25 UTC


README

一个PHP库,通过解析User-Agent来检测浏览器、操作系统、平台和设备类型。
这个库专注于高性能和低内存使用HTTP客户端解析。
使用简单快速的算法,准确检测超过165种浏览器类型和60多种操作系统类型。
对于最常见的浏览器,解析过程在低级共享主机上也少于0.0005秒。
在识别罕见User-Agent的情况下,相同条件下托管环境的时间少于0.0008秒。
该库仅支持真正当前的浏览器和操作系统,不支持目前实际上未使用的旧环境。
通过仅使用一个库文件,无需任何第三方库依赖即可工作。

要求

此库需要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_type)
返回操作系统(OS)类型。
所有可能的值

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

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

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

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

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

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

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

浏览器名称 (browser_name)
返回浏览器名称或在无法识别浏览器名称的情况下返回 unknown
例如:ChromeFirefoxUC Browser华为浏览器Vivaldi 等。

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

浏览器标题 (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 9; LLD-L31) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.136 YaBrowser/20.2.4.153.00 Mobile Safari/537.36';
$result = $Browser->getOS($useragent);
print_r($result);

?>

返回

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

浏览器检测

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

<?php

$Browser = new foroco\BrowserDetection();

$useragent = 'Mozilla/5.0 (iPad; CPU OS 9_3_4 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/80.0.3987.122 Mobile/13G35 Safari/601.1.46';
$result = $Browser->getBrowser($useragent);
print_r($result);

?>

返回

Array
(
    [browser_name] => Chrome
    [browser_version] => 80
    [browser_title] => Chrome 80
    [browser_chrome_original] => 1
    [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
)

设备检测

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

<?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/81.0.4044.138 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] => 81
    [browser_title] => Chrome 81
    [browser_chrome_original] => 1
    [browser_firefox_original] => 0
    [browser_safari_original] => 0
    [browser_chromium_version] => 81
    [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);
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

许可证

MIT 许可证 (MIT)

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

在此特此授予任何获得此软件及其相关文档副本(“软件”)的人免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向获得软件的人提供软件,前提是遵守以下条件

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

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