Fileinfo関数でMIMEタイプを取得する
Fileinfo関数は以前はPECL拡張モジュールでしたが、PHP5.3.0以降は特にCライブラリの追加も必要なく、デフォルトで有効になってます。
今回、初めてこの関数をWindows版で使ってみたメモです。
サンプルコード
ソートとか余計な処理も入ってますが、RecursiveDirectoryIteratorとRecursiveIteratorIteratorで再帰的にディレクトリ内にあるファイルのMIMEタイプを表示しています。
拡張子を偽ったファイルでも、きちんと本来のMIMEタイプが表示されました。
ついでに、MIMEタイプ取得の仕組みも調べてみました。
Linux の場合、fileコマンド file -bi ファイル名 で Fileinfo関数でのFILEINFO_MIMEオプションと同じ結果を取得できます。
参考記事
http://d.hatena.ne.jp/perezvon/20061003/1159889657
Fileinfo関数が参照するmagicデータベース (環境変数 MAGIC で定義されるファイル、デフォルトは /usr/share/misc/magic)というファイルがあり、これが元々fileコマンドでフォーマットを識別するためのものなので、同じ結果になるということのようです。
magicファイルはどんな形式で定義されているかというと、たとえばPHPスクリプトの場合はこんな感じ。
# PHP scripts # Ulf Harnhammar <ulfh@update.uu.se> 0 search/1/c =<?php PHP script text !:mime text/x-php 0 search/1 =<?\n PHP script text !:mime text/x-php 0 search/1 =<?\r PHP script text !:mime text/x-php 0 search/1/w #!\ /usr/local/bin/php PHP script text executable !:mime text/x-php 0 search/1/w #!\ /usr/bin/php PHP script text executable !:mime text/x-php
search/1/c の部分とその後の書式はよく分かりませんが、ファイルの先頭何バイト目という感じで文字列をチェックして決定する仕組みのようです。
いわゆるマジックナンバーというものですね。
Wikipedia マジックナンバー
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_%28%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E8%AD%98%E5%88%A5%E5%AD%90%29
PHP5.3.0以降ではこのmagicファイルを扱うためのlibmagicライブラリがPHPに同梱されるため、fileコマンドのないWindowsでもFileinfo関数が使えるということのようです。
また、finfo_open()関数 または finfo::__construct() の第2引数でmagicデータベースファイルを指定できるので、定義が足りない場合はそちらに追加するなりアプリケーション用に編集したものを配置するなりで対応できるようです。(コンパイルが必要なようですが)
参考記事
http://d.hatena.ne.jp/kanehama/20081016/1244700242
恥ずかしながら今までこういう仕組みを知らなかったので、勉強になりました。