【php】ファイルの存在確認の速度比較
問題
phpでファイルの有無を確認する関数がいくつかありますが、どれが速いですか。
- is_readable - ファイルが存在し、読み込み可能であるかどうかを知る
- file_exists - ファイルまたはディレクトリが存在するかどうか調べる
- is_file - 通常ファイルかどうかを調べる
答え
それぞれ何度か実行して時間を計測する。
あるディレクトリに1~10000のファイル名のファイルを作成。
$ cd xxx
$ touch {1..10000}
1~20000のファイル名でランダムに10万回ファイルの有無を確認する。あったりなかったりする状況を作る。
<?php
$t = microtime(true);
for ($i = 0; $i < 100000; ++$i) {
is_readable('x/' . rand(1, 20000));
}
echo microtime(true) - $t;
echo "\n";
<?php
$t = microtime(true);
for ($i = 0; $i < 100000; ++$i) {
file_exists('x/' . rand(1, 20000));
}
echo microtime(true) - $t;
echo "\n";
<?php
$t = microtime(true);
for ($i = 0; $i < 100000; ++$i) {
is_file('x/' . rand(1, 20000));
}
echo microtime(true) - $t;
echo "\n";
php7.4でそれぞれを10回実行して平均をとると以下の結果だった。
is_readable -> 0.534218 file_exists -> 0.47686 is_file -> 0.523497
差はわずかだが file_exists が高速だった。
10万回でこの差なので実用上ほぼ速度差が問題になることはないでしょう。
あとは用途の問題で、ディレクトリでもtrueが返ってよいか、有無が問題か、権限的に読めるかどうかまで確認するかなど考えて使うこと。