2009-04-27 11 views

答えて

132

is_file()は、指定されたパスがディレクトリを指している場合はfalseを返します。 file_exists()は、指定されたパスが有効なファイルまたはディレクトリを示す場合、trueを返します。それはあなたのニーズに完全に依存します。 、具体的にはを知りたい場合は、ファイルであるかどうかを確認するには、is_file()を使用してください。それ以外の場合は、file_exists()を使用します。

+1

私が知る限り、if_fileはディレクトリだけでなくシンボリックリンクにも失敗します。 – stefs

+36

クイックテストを実行しましたが、実際にはシンボリックリンクを解決します。 – hbw

30

is_file()が最も速いですが、最近のベンチマークでは、file_exists()が私にとっては少し速いことが示されています。だから私はそれがサーバーに依存すると思います。

私のテストベンチマーク:

benchmark('is_file'); 
benchmark('file_exists'); 
benchmark('is_readable'); 

function benchmark($funcName) { 
    $numCycles = 10000; 
    $time_start = microtime(true); 
    for ($i = 0; $i < $numCycles; $i++) { 
     clearstatcache(); 
     $funcName('path/to/file.php'); // or 'path/to/file.php' instead of __FILE__ 
    } 
    $time_end = microtime(true); 
    $time = $time_end - $time_start; 
    echo "$funcName x $numCycles $time seconds <br>\n"; 
} 

編集:コメントを@Tivieのおかげ。サイクル数を1000から10kに変更しました。結果は次のとおりです。

is_file X 10000 1.5651218891144秒

file_exists X 10000 1.5016479492188秒

is_readable X 10000 3.7882499694824秒

    1. ファイル存在

      ファイルが存在しない場合

      is_file X 10000 0.23920488357544秒

      file_exists X 10000 0.22103786468506秒

      is_readable X 10000 0.21929788589478秒

    編集:は、clearstatcacheを移動()。ループ内。ありがとうCJデニス。

  • +5

    このベンチマークが機能するには、clearstatcache()を追加する必要があります。 is_fileとfile_existsの結果はスクリプト全体でキャッシュされるためです。とにかくfile_exists()は少し遅くなりますが、約100Kのファイルチェックを実行しない限り、違いはありません。 http://www.php.net/manual/en/function.clearstatcache.php – Tivie

    +1

    私は 'file_exists()'よりも 'is_file()'を早く見つけました。それがディレクトリではなくファイルであることがわかっている場合は、間違いなく代わりに使用してください。 – Jonathan

    +1

    奇妙なことに、今は 'file_exists'が 'is_file'より高速です。 – weynhamz

    関連する問題