読者です 読者をやめる 読者になる 読者になる

k-holyのPHPとか諸々メモ

Webで働くk-holyがPHP(スクリプト言語)とか諸々のことをメモしていきます。ソースコードはだいたいWindowsで動かしてます。

Fileinfo関数でMIMEタイプを取得する

PHP SPL Windows

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

恥ずかしながら今までこういう仕組みを知らなかったので、勉強になりました。