當前位置: 首頁> 最新文章列表> 自定義擴展get_client_version支持更多客戶端信息

自定義擴展get_client_version支持更多客戶端信息

gitbox 2025-05-11

在開發Web 應用時,了解客戶端的詳細信息可以幫助我們進行更精細的功能適配、安全驗證以及用戶行為分析。 PHP 是一種靈活的服務器端語言,可以通過函數來解析客戶端的User-Agent ,但我們也可以通過自定義的get_client_version函數實現更強大、可擴展的客戶端信息提取功能。

一、基本思路

get_client_version函數的核心目的是從請求頭中提取客戶端的類型(如瀏覽器、操作系統、設備類型)和版本信息。我們將通過解析$_SERVER['HTTP_USER_AGENT']來實現這一功能,並支持加載自定義擴展規則。

二、函數實現

以下是基礎版本的get_client_version函數實現,並支持加載用戶自定義的擴展:

 function get_client_version($user_agent = null, $custom_rules = []) {
    if (is_null($user_agent)) {
        $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
    }

    $clients = [
        'Chrome' => '/Chrome\/([0-9\.]+)/',
        'Firefox' => '/Firefox\/([0-9\.]+)/',
        'Safari' => '/Version\/([0-9\.]+).*Safari/',
        'Edge' => '/Edg\/([0-9\.]+)/',
        'Opera' => '/OPR\/([0-9\.]+)/',
        'Internet Explorer' => '/MSIE\s([0-9\.]+);/',
        'Windows' => '/Windows NT ([0-9\.]+)/',
        'macOS' => '/Mac OS X ([0-9_\.]+)/',
        'iOS' => '/iPhone OS ([0-9_\.]+)/',
        'Android' => '/Android ([0-9\.]+)/',
    ];

    // 合併自定義規則
    if (!empty($custom_rules) && is_array($custom_rules)) {
        $clients = array_merge($clients, $custom_rules);
    }

    $result = [];

    foreach ($clients as $name => $pattern) {
        if (preg_match($pattern, $user_agent, $matches)) {
            $result[$name] = str_replace('_', '.', $matches[1]);
        }
    }

    return $result;
}

三、使用示例

$client_info = get_client_version();

// 輸出客戶端信息
echo '<pre>';
print_r($client_info);
echo '</pre>';

四、支持自定義擴展

你可以通過傳遞自定義規則來檢測專屬的客戶端特徵,比如企業內部定制的應用客戶端或某些特殊的瀏覽器殼。

 $custom_rules = [
    'MyAppClient' => '/MyApp\/([0-9\.]+)/'
];

$client_info = get_client_version(null, $custom_rules);

// 輸出客戶端信息,包括自定義內容
echo '<pre>';
print_r($client_info);
echo '</pre>';

五、典型應用場景

  1. 用戶分析:統計用戶使用的瀏覽器和版本分佈。

  2. 功能兼容性處理:針對不同瀏覽器或系統做兼容性優化。

  3. 安全策略:識別不受支持的客戶端並禁止訪問。

  4. API 限制:根據客戶端信息限制特定客戶端調用某些接口。

六、部署建議

  • 推薦在項目的公共入口處統一調用get_client_version並將結果緩存至$_SESSION或日誌記錄。

  • 針對高並發環境建議結合Redis 或文件緩存,避免重複解析。

七、參考鏈接