アクセスしてきたユーザが携帯かどうかは、正確にやるならIPアドレスで判断ということになるけど、
ある程度緩くても良いって言うんであればUserAgentで判断するのが一般的だと思います。

UserAgentには携帯会社毎にに特徴的な語句が織り込まれているので、
それをキーに正規表現とかで同定した上で、適当に振り分けるとかするわけです…が。
機種はガンガン新しくなるし、仕様も地味に変わっていくし、
場合によっては例外があったり、運営会社が変わってしまったりすることもあって、
はっきり言って面倒。


というわけで、1年半くらい前から、
PEARで公開されているPEAR::Net_UserAgent_Mobileを使っています。

PEAR :: Package :: Net_UserAgent_Mobile

ライブラリに依存することで、情報の更新に鈍感になるリスクはあるんですが、
それは自分で作ったとしても同じことなので同じリスクなら楽な方を選ぼうということで。


以下、簡単な紹介。

さくらインターネットでのPEARのインストール

ユーザ領域にPEARをインストールしていない場合には、
インストールしておきます。
ググればたくさんありますので、下記のサイトを参考にしてみて下さい。

さくらでpearインストール覚書

コマンドラインが苦手な人はFilename of WebFrontendを、
アクセス可能領域(wwwディレクトリ以下)に設定すれば、
GUIでインストールできます。

小山太郎.com ? Blog Archive ? さくらインターネットでPEARをインストール



Net_UserAgent_Mobileをインストール

こちらも省略します。

ただググって出てくる多くの文章では『β版なので…』という記述が出てきますが、
現在は1.0.0RC1になっていて、一応β版ではないので、その辺適当にアレンジが必要です。



PEARにパスを通す

PEARディレクトリへのパスを、php.iniファイルのinclude_pathに追加しておきます。



サンプルコード

使い方は非常にシンプルです。

require_once('Net/UserAgent/Mobile.php');

$m = Net_UserAgent_Mobile::factory();

if($m->isDoCoMo() === true):
  print 'ドコモからのアクセスです。';
endif;



メソッドの例

以下、よく使うだろうと思われるメソッドの例です。

ドコモ端末からのアクセスの時trueを返す
isDoCoMo()
au端末からのアクセスの時trueを返す
isEZweb()
ソフトバンク端末からのアクセスの時trueを返す
isSoftBank()
ウィルコム端末からのアクセスの時trueを返す
isWillcom()
ディスプレイに関するデータを取得する
getDisplay()
$display = $agent->getDisplay();
$width  = $display->getWidth();
$height = $display->getHeight();

ちなみにドキュメントの一部には、
「isMobile()」というメソッドがあるかのように書かれていますが、
実際にはエラーになります。誤植か仕様変更かはわかりませんが。

実際には「isMobile()」ではなくて、「isNonMobile()」。

携帯以外からのアクセスの時trueを返す
isNonMobile()


その他のメソッドなどについては、ドキュメントを参照してください。

Net_UserAgent_Mobile 1.0.0RC1




…しかし、使い始めから今までお世話になりつつ常に思ってるんだけど、
これメンテナンス面倒だろうなぁ…
特に新しい機能とかじゃなくて、
ユーザーエージェントが変わったときのルーチンみたいな感じだもんなぁ。

本当にご苦労さまです。