PHPにおいて、最強のファイル一覧表示は何か!?

 PHP TIPS:ITproを見ていたら「PHP TIPS – 71. PHPの便利な関数 glob:ITpro」という記事がありまして。多くのレンタルサーバでMySQLが使えて、WordPressで手軽にブログを立ち上げることのできるこの時代に、今更PHPでファイル操作をしてカウンターや掲示板を設置することもないだろうと思いましたが、知っといて損もないだろうと思い取り上げてみました。

PHPでファイルの一覧表示方法っていっぱいあるんですね

 glob関数だけかと思いきや、結構いろいろな方法があるのですよ。

  • globを使う
  • scandirを使う
  • opendirとreaddirを使う
  • DirectoryIteratorを使う

準備

 今回のために次のようなフォルダとファイルを用意しました。

20150605_1

Googleの画像検索で適当にファイルをダウンロードしてフォルダにいれました。後の実験のためにjpg、png、gifを複数用意。なんでラーメンなのかというと、お腹が減っていたからです(真顔

各方法でファイル名の一覧表示

 「ra-men」フォルダ以下のファイル名の一覧をそれぞれの方法で表示させてみます。

無事表示されます。

20150605_2

その他の方法も試してみます。

scandir

これでもいけました。

opendirとreaddir

DirectoryIterator

速度比較

 各方法で実行速度にどれくらい差がでるのか比べてみました。

結果はこうなりました。環境はインテルi7@3.40GHz、メモリ8GB、64ビットのWindows7です。

glob:8406.48007
scandir:3081.177
opendir&readdir:3076.17593
DirectoryIterator:3372.19214

単位は「ミリ秒」です。globだけ8秒かかっており、倍以上の時間です(;´Д`)

ではどのような場合にglob関数を使うか?

 ファイルの一覧表示のにおいてはスピードで劣るglob関数ですが、メリットは「パターンにマッチするパス名をリスト化して返してくれる」ことです。先ほどのフォルダでjpgファイルだけを抜き出すならば、

でできます。例えばこれをopendirとreaddirでやろうとすると、

としなければならず、ソースコードの可読性は落ちます。

 実行速度の面ではどうでしょうか。先ほどのソースコードをこちらの記事「PHP – ファイル名から拡張子を取得する関数、ベンチマークもあるよ – たきゃはしです」を参考に拡張子によりファイルを抜き出す処理を付け足してみます。拡張子の判別方法は最速である「’.’を検索し、それ以降の文字を取得する」方法でいきたいと思います。

結果

glob:8359.47895
scandir:3256.18601
opendir&readdir:3237.185
DirectoryIterator:3554.20303

(;^ω^)

関数の呼び出しコストなのか、glob関数以外の方法で約0.2秒ずつ処理時間が伸びましたが、結局globだけが倍以上の時間がかかることに変わりはなく。

結論

 glob関数はソースコードの可読性を上げることには役に立つものの、処理速度の面ではその他の方法に比べて2倍以上の処理時間がかかることは間違いないようです。ただ、ファイル名の取得処理はそれほど頻繁に行うような処理でもないので、処理速度にそれほど気を配る必要もないし、複数のフォルダにまたがったファイル検索もglob関数の一文で表現できることから、やはり便利な関数であると思います。

 なんだか、glob関数をディスっただけで終わってしまったような。

「役に立った」と思ったら、記事のシェアをお願いします。

スポンサーリンク

Comment

コメント認証制です。反映されるまで時間が掛かる場合があります。
URLの記入はhttpのhを抜いて下さい(宣伝対策です)。
連続でコメントするとスパム扱いになる場合があります。
しばらく待ってからコメントしてください。

CAPTCHA


TOP