silnik / browser
PHP的用户代理嗅探库
Requires
- php: >=8.2
- psr/cache: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- cache/array-adapter: ^1.1
- icomefromthenet/reverse-regex: 0.0.6.3
- php-coveralls/php-coveralls: ^2.0
- phpunit/php-code-coverage: ^5.0 || ^7.0
- phpunit/phpunit: ^6.0 || ^8.0
- squizlabs/php_codesniffer: ^3.5
- symfony/yaml: ~3.4 || ~4.0
Suggests
- cache/array-adapter: Allows testing of the caching functionality
README
但是为什么几乎完全无用而不是完全没有用? 好吧,总有例外。进行浏览器嗅探有合理的理由:为了提升用户体验或收集关于你的网站上使用哪些浏览器的情报。我的网站是html5test.com,我想知道哪些分数属于哪个浏览器。为此,你需要一个浏览器嗅探库。
为什么它如此复杂?
因为每个人都在说谎。严肃地说,没有一种浏览器是完全诚实的。几乎所有浏览器都宣称自己是Netscape 5,几乎所有WebKit浏览器都宣称基于Gecko。即使现在的Internet Explorer 11也不再声称是IE,而是一个类似Gecko的无名浏览器。而且情况变得更糟。这就是为什么它很复杂。
它提供什么样的信息? 你会得到一个包含关于浏览器、渲染引擎、操作系统和设备信息的漂亮对象。它提供了名称和版本,甚至设备制造商和型号。WhichBrowser非常坚韧。它提供了其他人没有的信息。例如
JUC (Linux; U; 2.3.6; zh-cn; GT-I8150; 480*800) UCWEB8.7.4.225/145/800
UC Browser 8.7 on a Samsung Galaxy W running Android 2.3.6
Android从不被提及
Mozilla/5.0 (Series40; Nokia501/10.0.2; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.0.0.0.73
Nokia Xpress 3.0.0 on a Nokia Asha 501 running Nokia Asha Platform
尽管用户代理头声称是一个Series40设备,但我们知道它实际上运行的是Asha平台,我们还知道OviBrowser已被更名为Nokia Xpress。
Opera/9.80 (X11; Linux zvav; U; zh) Presto/2.8.119 Version/11.10
Opera Mini on a Nokia 5230 running Series60 5.0
用户代理头看起来像Linux上的Opera 11.10,但我们知道它是Opera Mini。我们甚至可以从其他头中推断出真实的操作系统和设备型号。
要求
WhichBrowser需要PHP 7.0或更高版本,并支持PHP 8。WhichBrowser与PSR-4自动加载标准兼容,并遵循PSR-1和PSR-2编码风格。
如何安装
您可以使用Composer(PHP的标准包管理器)安装WhichBrowser。该软件包的名称为silnik/browser
。
composer require silnik/browser
您可以通过运行简单的命令轻松更新WhichBrowser。
composer update silnik/browser
您应该尽可能经常运行此命令。您甚至可以考虑为此设置一个cron作业。
如何使用
第一步需要Composer自动加载器
<?php require 'vendor/autoload.php';
第二步是创建一个新的Silnik/Browser
对象。此对象将包含库能找到的所有浏览器信息。对象有一个必需的参数,即浏览器发送的头部,或用户代理字符串。使用头部是首选的,因为它将允许更好的检测,但如果您只有用户代理字符串,这也将有效。
例如
$result = new Silnik/Browser(getallheaders());
或
$result = new Silnik/Browser($_SERVER['HTTP_USER_AGENT']);
变量$result
现在包含一个对象,您可以查询信息。有各种方法来访问信息。
首先,您可以调用toString()
函数来获取可读的标识
"You are using " . $result->toString(); // You are using Chrome 27 on OS X Mountain Lion 10.8
另一种可能性是查询对象
$result->isType('desktop'); // true $result->isType('mobile', 'tablet', 'media', 'gaming:portable'); // false $result->isBrowser('Maxthon', '<', '4.0.5'); // false $result->isOs('iOS', '>=', '8'); // false $result->isOs('OS X'); // true $result->isEngine('Blink'); // true
您也可以直接访问这些属性
$result->browser->toString(); // Chrome 27 $result->engine->toString(); // Blink $result->os->toString(); // OS X Mountain Lion 10.8
或直接访问这些属性的某些部分
$result->browser->name; // Chrome $result->browser->name . ' ' . $result->browser->version.toString(); // Chrome 27 $result->browser->version->value; // 27.0.1453.110 $result->engine->name; // Blink
最后,您也可以直接查询版本
$result->browser->version->is('>', 26); // true $result->os->version->is('<', '10.7.4'); // false
选项
您可以在创建Parser
对象时通过传递数组作为第二个参数来设置额外的选项。
禁用机器人检测
在某些情况下,您可能想要禁用机器人检测。这允许机器人故意欺骗WhichBrowser,以便您可以抓取机器人尝试模拟的用户代理身份。这特别方便,当您想使用Silnik\Browser在网站的多个变体之间切换并确保爬虫看到网站的正确版本时。例如,模仿移动设备的机器人将看到您的移动版网站。
$result = new Silnik/Browser(getallheaders(), [ 'detectBots' => false ]);
启用结果缓存
WhichBrowser支持PSR-6兼容的缓存适配器,用于在请求之间缓存结果。使用缓存特别有用,如果您在网站的所有页面上使用Silnik\Browser,并且用户访问多个页面。在第一次访问期间,将解析标题并缓存结果。在随后的访问中,将使用缓存的结果,这比再次解析标题要快得多。
还有其他类型缓存的适配器可用,例如APC、Doctrine、Memcached、MongoDB、Redis等。这些适配器的配置各不相同,但一旦配置完成,您只需在创建Parser
对象时将其作为选项传递,或者使用setCache()
函数在之后设置它。WhichBrowser已测试过与PHP Cache提供的适配器一起工作。有关提供适配器的其他软件包列表,请参阅Packagist。
例如,如果您想启用基于Memcached的缓存,您需要安装一个额外的Composer软件包
composer require cache/memcached-adapter
并按如下方式更改对silnik/browser的调用
$client = new \Memcached(); $client->addServer('localhost', 11211); $pool = new \Cache\Adapter\Memcached\MemcachedCachePool($client); $result = new Silnik/Browser(getallheaders(), [ 'cache' => $pool ]);
或
$client = new \Memcached(); $client->addServer('localhost', 11211); $pool = new \Cache\Adapter\Memcached\MemcachedCachePool($client); $result = new Silnik/Browser(); $result->setCache($pool); $result->analyse(getallheaders());
您还可以指定缓存结果应丢弃多少秒。默认值是900秒或15分钟。如果您认为WhichBrowser在缓存方面使用过多的内存,应降低此值。您可以通过设置cacheExpires
选项或将它作为setCache()
函数的第二个参数来做到这一点。
API参考
Parser对象
创建一个新的Silnik/Browser
对象后,它包含许多属性和函数。所有这些属性都保证存在。
属性
browser
一个包含浏览器自身信息的对象engine
一个包含渲染引擎信息的对象os
一个包含操作系统信息的对象device
一个包含设备信息的对象
函数
getType()
返回device
对象的type
和subtype
属性。如果存在子类型,它将与类型连接,并用分号分隔,例如:mobile:smart
或gaming:portable
。如果子类型不适用,它将只返回类型,例如:desktop
或ereader
。
isType($type [,$type [,$type [,$type]]])
如果使用单个参数,该函数将返回true
,如果参数与device
对象的type
属性匹配。参数可以可选地通过将子类型连接到类型并用分号分隔来提供子类型。它可以使用多个参数,在这种情况下,函数将返回true
,如果任何一个参数匹配。如果没有参数匹配,它将返回false
isMobile()
如果浏览器是手机、平板电脑、电子阅读器、相机、便携式媒体播放器、手表或便携式游戏机等移动设备,则返回true
。否则返回false
。
isBrowser($name [, $comparison, $version])
用于查询browser
对象的name
和version
属性。该函数可以包含一个基于name
的简单比较的单个参数,或者包含三个参数来比较name
和version
。第一个参数始终包含浏览器的名称。第二个参数是一个字符串,可以是<
、<=
、=
、=>
或>
。第三个是一个整数、浮点数或字符串,其中包含版本。您可以使用版本如10
、10.7
或'10.7.4'
。有关版本比较如何执行的更多信息,请参阅Version
对象的is()
函数。
isEngine($name [, $comparison, $version])
用于查询 engine
对象的 name
和 version
属性。此函数与 isBrowser
的工作方式完全相同。
isOs($name [, $comparison, $version])
用于查询 os
对象的 name
和 version
属性。此函数与 isBrowser
的工作方式完全相同。
isDetected()
是否真的检测到某些浏览器,或者我们未能检测到任何内容?
toString()
获取检测到的浏览器的可读表示形式,包括操作系统和设备信息。
浏览器对象
Silnik\Browser\Model\Browser
类的对象用于 browser
属性的主 Silnik/Browser
对象,并包含多个属性。如果在此情况下属性不适用,它将为 null 或 undefined。
属性
name
包含浏览器名称的字符串alias
包含浏览器备选名称的字符串version
包含有关浏览器版本信息的版本对象stock
布尔值,如果浏览器是操作系统的默认浏览器则为 true,否则为 falsechannel
包含发行渠道的字符串,即 'Nightly' 或 'Next'。mode
可以包含浏览器操作模式的字符串,例如 'proxy'。hidden
布尔值,如果浏览器没有名称且是操作系统的默认浏览器,则为 truefamily
包含有关此浏览器属于哪个家族的信息的对象using
包含有关此浏览器使用哪种类型的 WebView 的信息的对象
函数
isFamily($name)
此浏览器的家族是否有此名称,或者浏览器本身是否有此名称。
isUsing($name)
浏览器是否使用具有提供名称的 WebView。
getName()
获取浏览器的名称
getVersion()
获取浏览器的版本
toString()
获取检测到的浏览器的可读表示形式
引擎对象
Silnik\Browser\Model\Engine
类的对象用于主 Silnik/Browser
对象的 engine
属性,并包含多个属性。如果在此情况下属性不适用,它将为 null 或 undefined。
属性
name
包含渲染引擎名称的字符串version
包含有关渲染引擎版本信息的版本对象
函数
getName()
获取渲染引擎的名称
getVersion()
获取渲染引擎的版本
toString()
获取检测到的渲染引擎的可读表示形式
操作系统对象
Silnik\Browser\Model\Os
类的对象用于主 Silnik/Browser
对象的 os
属性,并包含多个属性。如果在此情况下属性不适用,它将为 null 或 undefined。
属性
name
包含操作系统名称的字符串version
包含有关操作系统版本信息的版本对象family
包含有关此操作系统属于哪个家族的信息的对象
函数
isFamily($name)
此操作系统的家族是否有此名称,或者操作系统本身是否有此名称。
getName()
获取操作系统的名称
getVersion()
获取操作系统的版本
toString()
获取检测到的操作系统的可读表示形式
设备对象
Silnik\Browser\Model\Device
类的对象用于主 Silnik/Browser
对象的 device
属性,并包含多个属性。如果在此情况下属性不适用,它将为 null 或 undefined。
属性
type
包含浏览器类型的字符串subtype
包含浏览器子类型的字符串identified
布尔值,如果设备已被正面识别,则为 truemanufacturer
包含设备制造商的字符串,例如 'Apple' 或 'Samsung'。model
作为包含设备型号的字符串,例如 'iPhone' 或 'Galaxy S4'。
type
属性可以包含以下列表中的任何值
- 桌面
- 移动
- PDA
- DECT
- 平板
- 游戏
- 电子阅读器
- 媒体
- 耳机
- 手表
- 模拟器
- 电视
- 显示器
- 相机
- 打印机
- 标牌
- 白板
- 开发板
- 空中
- 家电
- GPS
- 汽车
- POS
- 机器人
- 投影仪
如果 type
是 "移动",则 subtype
属性可以包含以下列表中的任何值
- 特性
- 智能
如果 type
是 "游戏",则 subtype
属性可以包含以下列表中的任何值
- 游戏机
- 便携式
函数
getManufacturer()
获取制造商名称
getModel()
获取型号名称
toString()
获取检测到的设备的可读表示
家族对象
Silnik\Browser\Model\Family
类的对象用于 Silnik\Browser\Model\Browser
和 Silnik\Browser\Model\Os
对象的 family
属性,并包含多个属性。如果某个属性不适用于此情况,则它将是 null 或未定义。
属性
name
包含家族名称的字符串version
包含家族版本信息的版本对象
函数
getName()
获取家族名称
getVersion()
获取家族版本
toString()
获取家族的可读表示
使用对象
Silnik\Browser\Model\Using
类的对象用于 Silnik\Browser\Model\Browser
对象的 using
属性,并包含多个属性。如果某个属性不适用于此情况,则它将是 null 或未定义。
属性
name
包含 webview 名称的字符串version
包含有关 webview 版本信息的版本对象
函数
getName()
获取 webview 名称
getVersion()
获取 webview 版本
toString()
获取 webview 的可读表示
版本对象
Silnik\Browser\Model\Version
类的对象用于 browser
、engine
和 os
对象的 version
属性,并包含多个属性和函数。如果某个属性不适用于此情况,则它将是 null 或未定义。
属性
值
包含原始版本号的字符串。alias
包含版本号别名的字符串,例如 Windows 的 '5.1' 为 'XP'。昵称
包含版本号昵称的字符串,例如 OS X 的 '10.14' 为 'Mojave'。详细信息
包含应打印的版本号数字的整数。
函数
is($version)
或 is($comparison, $version)
使用此函数可以轻松比较两个版本。如果您指定一个参数,此函数将返回版本是否相同。您还可以指定两个参数,在这种情况下,第一个参数包含比较运算符,例如 <
、<=
、=
、=>
或 >
。第二个参数是要比较的版本。您可以使用版本号如 10
、10.7
或 '10.7.4'
,但请注意,10
与 10.0
不相同。例如,如果我们的 OS 版本是 10.7.4
$result->os->version->is('10.7.4'); // true $result->os->version->is('10.7'); // true $result->os->version->is('10'); // true $result->os->version->is('10.0'); // false $result->os->version->is('>', '10'); // false $result->os->version->is('>', '10.7'); // false $result->os->version->is('>', '10.7.3'); // true