這是一個極為複雜且幾乎完全無用的瀏覽器嗅探函式庫。無用,因為您不應該使用瀏覽器嗅探。所以現在就停下來,去閱讀一些關於特徵檢測的內容。我是認真的。離開。以後你會感謝我的。
用於伺服器上的 WhichBrowser 的 PHP 版本。與 PHP 7.0 或更高版本完全相容,包括 PHP 8。
還提供:
哪個瀏覽器/解析器-JavaScript
與伺服器上的 Node.js 一起使用的 WhichBrowser 的 JavaScript 版本
哪個瀏覽器/伺服器
用 PHP 編寫的伺服器,提供 JavaScript API 以供瀏覽器使用
但為什麼幾乎完全沒用又不是完全沒用呢?嗯,規則總有例外。進行瀏覽器嗅探是有充分理由的:改善使用者體驗或收集有關您網站上使用的瀏覽器的情報。我的網站是 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
儘管 useragent 標頭聲稱是 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
useragent 標頭看起來像 Linux 上的 Opera 11.10,但我們知道它是 Opera Mini。我們甚至可以從其他標頭中找出真實的作業系統和裝置型號。
WhichBrowser 需要 PHP 7.0 或更高版本,並支援 PHP 8。
您可以使用 Composer(PHP 的標準套件管理器)來安裝 WhichBrowser。該包稱為whichbrowser/parser
。
composer require whichbrowser/parser
您可以透過執行簡單的命令輕鬆更新 WhichBrowser。
composer update whichbrowser/parser
您應該盡可能頻繁地執行此命令。您甚至可能需要考慮為此目的設定 cron 作業。
第一步需要 Composer 自動載入器:
<?php
require ' vendor/autoload.php ' ;
第二步是建立一個新的WhichBrowserParser
物件。該物件將包含庫可以找到的有關瀏覽器的所有資訊。該物件有一個必需的參數,可以是瀏覽器發送的標頭,也可以是用戶代理字串。使用標頭更好,因為它可以更好地進行檢測,但如果您只有 useragent 字串,這也可以工作。
例如:
$ result = new WhichBrowser Parser ( getallheaders ());
或者:
$ result = new WhichBrowser Parser ( $ _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,這樣您就可以獲得機器人試圖模仿的 useragent 的身份。當您想要使用 WhichBrowser 在網站的不同變體之間切換並希望確保爬蟲看到網站的正確變體時,這尤其方便。例如,模仿行動裝置的機器人將看到您網站的行動版本。
$ result = new WhichBrowser Parser ( getallheaders (), [ ' detectBots ' => false ]);
WhichBrowser 支援 PSR-6 相容的快取適配器,用於快取請求之間的結果。如果您在網站的每個頁面上都使用 WhichBrowser 並且使用者造訪多個頁面,那麼使用快取尤其有用。在第一次訪問期間,將解析標頭並快取結果。在進一步存取時,將使用快取的結果,這比一次又一次解析標頭要快得多。
還有適用於其他類型快取的適配器,例如 APC、Doctrine、Memcached、MongoDB、Redis 等等。這些適配器的配置都各不相同,但是一旦配置好,您所要做的就是在創建Parser
物件時將其作為選項傳遞,或者在之後使用setCache()
函數進行設定。 WhichBrowser 已經過測試,可以與 PHP Cache 提供的適配器一起使用。有關提供適配器的其他軟體包的列表,請參閱 Packagist。
例如,如果您想啟用基於 memcached 的緩存,則需要安裝額外的 Composer 軟體包:
composer require cache/memcached-adapter
並將呼叫更改為 WhichBrowser/Parser,如下所示:
$ client = new Memcached ();
$ client -> addServer ( ' localhost ' , 11211 );
$ pool = new Cache Adapter Memcached MemcachedCachePool ( $ client );
$ result = new WhichBrowser Parser ( getallheaders (), [ ' cache ' => $ pool ]);
或者
$ client = new Memcached ();
$ client -> addServer ( ' localhost ' , 11211 );
$ pool = new Cache Adapter Memcached MemcachedCachePool ( $ client );
$ result = new WhichBrowser Parser ();
$ result -> setCache ( $ pool );
$ result -> analyse ( getallheaders ());
您也可以指定多少秒後應丟棄快取結果。預設值為 900 秒或 15 分鐘。如果您認為 WhichBrowser 使用太多內存進行緩存,您應該降低該值。您可以透過設定cacheExpires
選項或將其作為第二個參數傳遞給setCache()
函數來完成此操作。
建立新的WhichBrowserParser
物件後,它包含許多屬性和函數。所有這些屬性都保證存在。
特性:
browser
engine
os
device
功能:
getType()
傳回device
物件的type
和subtype
屬性。如果存在子類型,則將其與類型連接並以半色分隔,例如: mobile:smart
或gaming:portable
。如果子類型不適用,則僅傳回類型,例如: desktop
或ereader
。
isType($type [,$type [,$type [,$type]]])
如果使用單一參數,且該參數與device
物件的type
屬性相匹配,則該函數傳回true
。此參數還可以選擇透過將子類型連接到類型並用分號分隔來提供子類型。它可以使用多個參數,在這種情況下,如果其中一個參數匹配,函數將傳回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()
取得偵測到的瀏覽器的人類可讀表示,包括作業系統和裝置資訊。
WhichBrowserModelBrowser
類別的物件用於主WhichBrowserParser
物件的browser
屬性,並包含許多屬性。如果屬性在這種情況下不適用,它將為 null 或未定義。
特性:
name
alias
version
stock
channel
mode
hidden
family
using
功能:
isFamily($name)
這個瀏覽器家族有這個名字嗎,或是瀏覽器本身有這個名字嗎?
isUsing($name)
瀏覽器是否使用帶有提供名稱的 webview。
getName()
取得瀏覽器的名稱
getVersion()
取得瀏覽器版本
toString()
取得偵測到的瀏覽器的人類可讀表示
WhichBrowserModelEngine
類別的物件用於主WhichBrowserParser
物件的engine
屬性,並包含許多屬性。如果屬性在這種情況下不適用,它將為 null 或未定義。
特性:
name
version
功能:
getName()
取得渲染引擎的名稱
getVersion()
取得渲染引擎的版本
toString()
取得偵測到的渲染引擎的人類可讀表示
WhichBrowserModelOs
類別的物件用於主WhichBrowserParser
物件的os
屬性,並包含許多屬性。如果屬性在這種情況下不適用,它將為 null 或未定義。
特性:
name
version
family
功能:
isFamily($name)
該作業系統的家族是否具有此名稱,或者作業系統本身是否具有此名稱。
getName()
取得作業系統的名稱
getVersion()
取得作業系統的版本
toString()
取得偵測到的作業系統的人類可讀表示
WhichBrowserModelDevice
類別的物件用於主WhichBrowserParser
物件的device
屬性,並包含許多屬性。如果屬性在這種情況下不適用,它將為 null 或未定義。
特性:
type
subtype
identified
manufacturer
model
type
屬性可以包含以下清單中的任何值:
如果type
為“mobile”,則subtype
屬性可以包含以下清單中的任何值:
如果type
是“遊戲”, subtype
屬性可以包含以下清單中的任何值:
功能:
getManufacturer()
取得製造商名稱
getModel()
取得模型名稱
toString()
獲取檢測到的設備的人類可讀表示
WhichBrowserModelFamily
類別的物件用於WhichBrowserModelBrowser
和WhichBrowserModelOs
物件的family
屬性,並包含許多屬性。如果屬性在這種情況下不適用,它將為 null 或未定義。
特性:
name
version
功能:
getName()
獲取家人的姓名
getVersion()
取得家庭版本
toString()
獲取家庭的人類可讀表示
WhichBrowserModelUsing
類別的物件用於WhichBrowserModelBrowser
物件的using
屬性,並包含許多屬性。如果屬性在這種情況下不適用,它將為 null 或未定義。
特性:
name
version
功能:
getName()
取得網路視圖的名稱
getVersion()
取得webview的版本
toString()
取得網路視圖的人類可讀表示
WhichBrowserModelVersion
類別的物件用於browser
、 engine
和os
物件的version
屬性,並包含許多屬性和函數。如果屬性在這種情況下不適用,它將為 null 或未定義。
特性:
value
alias
nickname
details
功能:
is($version)
或是is($comparison, $version)
使用此功能可以輕鬆地將一個版本與另一個版本進行比較。如果僅指定一個參數,則如果版本相同,則函數將傳回。您也可以指定兩個參數,在這種情況下,第一個參數包含比較運算符,例如<
、 <=
、 =
、 =>
或>
。第二個參數是您要與之比較的版本。您可以使用10
、 10.7
或'10.7.4'
等版本,但請注意10
與10.0
不同。例如,如果我們的作業系統版本是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