php 偵測 browser 版本資訊

因為某種理由

需要去蒐集最新的 browser user-agent

本來寫了一個 parser 去讀 apache log

結果意外超多

DSC01249

因為 log 的 user-agent 種類真的是五花八門

一直在 google 找解決方案

後來試到一個好東西

http://php.net/manual/en/function.get-browser.php

php 有個 function 叫做 get_browser

簡單說他會偵測你目前連線的 browser 版本

如果你想指定 user-agent 的字串讓他辨識也 ok

function 很簡單只有兩個參數

mixed get_browser ([ string $user_agent [, bool $return_array = false ]] )

$user_agent 就是你要給他的 user-agent

不給的話就試偵測目前連線的 user-agent

$return_array 則是決定回傳值是要 object 或是 array

重點來了

我寫了一行測試的 code

程式噴了一行錯誤給我

get_browser(): browscap ini directive not set

這三小?

查了一下

原來這個函數

要配合一個網站的資源檔

https://browscap.org/

這個網站會給一個叫做 browscap.ini 的檔案

來輔助辨識 browser 的版本

所以你要下載這個檔案 (php 的話要下載 php_browscap.ini)

然後放在你的網站上

好 放上去以後

程式還是找不到

又 Google 了一下

Google 表示

你要在 php.ini 裡面設定這個檔案的路徑

我本來想用 ini_set 去寫這個值

但是失敗 (如果有人可以的話麻煩跟我講一下 感謝)

只好另外寫一個 php.ini 放在 public_html

然後把 php_browscap.ini 的路徑寫進去

類似這樣
browscap = /home/xxx/www/php_browscap.ini

然後再跑一次程式

範例程式如下

$arr = get_browser(null, true);
print_r($arr);

null的意思是讓 function 去讀連線者的 user-agent

會印出

Array
(
[browser_name_regex] => ~^mozilla/5.0 (.*mac os x.*) applewebkit/.* (khtml.* like gecko) chrome/56..*safari/.*$~
[browser_name_pattern] => Mozilla/5.0 (*Mac OS X*) AppleWebKit/* (KHTML* like Gecko) Chrome/56.*Safari/*
[parent] => Chrome 56.0
[platform] => MacOSX
[comment] => Chrome 56.0
[browser] => Chrome
[browser_maker] => Google Inc
[version] => 56.0
[majorver] => 56
[device_type] => Desktop
[device_pointing_method] => mouse
[minorver] => 0
[ismobiledevice] =>
[istablet] =>
[crawler] =>
)

這樣就完成啦

然後我再另外寫一個資料庫 去塞這些五花八門的 user-agent

並註記寫入的更新日期

這樣我就可以依照時間逆向排序

來抓某個瀏覽器最新版本是第幾版

不過 browscap.ini 也會更新

所以得另外寫一個 cron 去更新這個檔案

不過 browscap 完全知道工程師的企圖XD

他有在網頁上寫定期更新 browscap.ini 的原則

基本上我想一個禮拜更新一次應該就可以了

給大家參考~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料