PHP 5.3のfileinfo
PHP 5.3のリリースマネージャであるJohannes Schlüterさんのブログで、「A hidden gem in PHP 5.3」というPHP 5.3の新機能を紹介する一連のエントリが掲載されています。第1弾はfileinfo拡張モジュールの紹介(ドイツの方だからなのか微妙に訳しづらい英語…)。
A hidden gem in PHP 5.3: fileinfo – Johannes Schlüter
最近、PHP 5.3.0 Alpha 3がリリースされ、次期バージョンで提供される機能が出揃った。 名前空間に関する議論は多くあるが、それ以外の機能は長いNEWSファイルの中では見落としがちなので、新しい関数や新しい言語要素といった秘宝をいくつか取り上げようと思う。 このシリーズ(訳注:元ブログのphp53タグが付いた一連のポスト)は個人的なチョイスであって完全なものではないので、ドキュメントを置き換えるものではないし、単なるポインタにすぎない。 あなたにすぐに5.3を試してもらい、リリース前に可能な限りバグを潰せるようにするのが狙いだ。
今回のテーマについて、NEWSファイルにはとても短いエントリがある:
mime_magic拡張モジュールの置き換えとしてfileinfo拡張モジュールを追加した。 (Derick)
fileinfoとは何か?Fileinfoは、とてもよくある問題のための解決策である。 ファイルをダウンロードさせるときに、正しいContent-Typeヘッダを出力したいとしよう。 出力するMIMEタイプをどのように取得する? 多くのアプリケーションは拡張子とMIMEタイプのリストを保持しておき、ファイルの拡張子に対応するものをヘッダにセットしている。 しかし、リストには限られたペアしか含まれておらずダウンロードさせたいファイルがそこに含まれないかもしれない、という問題がある。 他にはexec()を使ってfileコマンドを呼び出すとか、長いこと非推奨となっているmime_content_type()を使うという方法がある。
古いmime_content_type()に比べて何が良いのか? 最大のメリットは設定がシンプルだということだ。mime_content_type()を使う場合どこかにマジックファイルを用意しておく必要があるが、fileinfoはマジックファイルを含んでいるため特別な設定が必要ない。 加えてfileinfoはファイルシステム上のファイルだけでなく、例えばメモリ内の文字列に対しても適用できる。もしデータがメモリ内にある場合は、finfo_bufferが変数またはPHPストリームラッパからの値のMIMEタイプを教えてくれる。
レガシーなコードを扱う人にとって嬉しい変更もある。mime_content_type()も内部でfileinfoを使うようになったため、mime_content_type()の利用者もトラブルなしにfileinfoによる恩恵を受けることができるのだ。マニュアルにサンプルが含まれているので、これを読みながら始めてみてくれ。
