2014年11月27日 星期四

PHP 偵測瀏覽器是否為手機

原理:

使用$_SERVER['HTTP_USER_AGENT']

前言:

忘了從哪邊看到的,HTTP Header的User-Agent是可以更改的,所以最好是在前端判斷(?)。不過我想用php來判斷應該可以應付大部分情況,而且今天都在遮疼php的解決方案,就把他記錄下來。

一、使用get_browser()

http://php.net/get_browser
get_browser()預設不能直接使用,須先做設定
安裝:
1. 到 http://browscap.org/ 下載PHP版本的full_php_browscap.ini
2. 然後設定php.ini 裡面[browscap]的
browscap = /your_browscap_ini_path/full_php_browscap.ini
3. 重啟apache
用法:
$browser = get_browser(null, true);
echo "is mobile:".$browser['ismobiledevice'];
報錯:
PHP:  syntax error, unexpected $end, expecting ']' in /etc/php/conf.d/full_php_browscap.ini on line 78
解法:
$ sed 's/;/\\\;/g' original_browscap.ini > browscap.ini
如果original_browscap.ini放在/etc/php/conf.d/ 下記得把original_browscap.ini移除,不然仍會報錯

因為使用browscap.ini ( 23MB ),刷頁面有呼叫get_browser()時會多800ms(不呼叫沒事),又ini_set無法在script時去設定browscap.ini
http://stackoverflow.com/questions/2545910/php-using-browscap-ini-on-shared-host-ini-set-failing
'browscap' is changeable only in the system php.ini and/or httpd.conf. You cannot set it at the script level.
且在cli時如果不加 -n 也會延遲,所以不建議使用這方法

參考資料:
https://github.com/browscap/browscap/issues/119

二、使用Mobile-Detect類

https://github.com/serbanghita/Mobile-Detect
require "Mobile-Detect/Mobile_Detect.php";
$detect = new Mobile_Detect;
echo "\$detect->isMobile():".$detect->isMobile();

可以在php.ini裡面設定include_path去呼叫該類別。或是把該類別放到/usr/share/pear下
我的php.ini設定:
include_path = ".:/usr/share/pear"
更多Mobile-Detect的使用方法:
https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples

三、使用phpbrowscap類別

https://github.com/GaretJax/phpbrowscap
安裝方法使用composer:
https://github.com/GaretJax/phpbrowscap/wiki/QuickStart
1. 在專案根目錄新增composer.json
{
    "require": {
        "garetjax/phpbrowscap": "~2.0"
    }
}
2.
$ wget http://getcomposer.org/composer.phar
$ php composer.phar install
如果這步有報錯
PHP Fatal error:  Class 'Phar' not found in /xxx/composer.phar on line xx
請將php.ini的
extension=phar.so 註解拿掉
安裝完成後目錄裡面會多出一個vendor的資料夾
新增一個test.php檔案:
<?php
require 'vendor/autoload.php'; //要用composer的類必須加入這行
use phpbrowscap\Browscap;
$bc = new Browscap('path/to/the/cache/dir'); //
$current_browser = $bc->getBrowser();
echo '<pre>'; // some formatting issues ;)
print_r($current_browser);
echo '</pre>';

因為刷http://localhost/test.php會刷很久刷不出來,所以放棄用第三個方式做

在FB的討論:
https://www.facebook.com/groups/199493136812961/permalink/713514665410803/
其他方法:
http://detectmobilebrowsers.com/mobile
http://www.useragentstring.com/pages/api.php #不建議使用,因為要去呼叫api
https://github.com/ventoviro/windwalker-environment #未測試
結論:
行動裝置太多樣了 幾個大牌子能正確偵測到已經夠了

沒有留言:

張貼留言