PHPのis_fileまたはfile_exists


117

指定した場所($ path。$ file_name)のHDDにファイルがあるかどうかを確認する必要があります。

is_file()file_exists()関数の違いはどれですか、どちらがPHPで使用するのに適していますか?

回答:


167

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


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

is_file()は、ファイルがディレクトリに存在する場合はtrueを、ファイルが存在しない場合はfalseを返します。2020年にチェックしたため、phpのバージョンが更新される可能性があります
heySushil

37

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に変更しました。結果は次のとおりです。

  1. ファイルが存在する場合

    is_file x 10000 1.5651218891144秒

    file_exists x 10000 1.5016479492188秒

    is_readable x 10000 3.7882499694824秒

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

    is_file x 10000 0.23920488357544秒

    file_exists x 10000 0.22103786468506秒

    is_readable x 10000 0.21929788589478秒

編集:clearstatcache();を移動 ループの内側。CJデニスに感謝します。


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

1
is_file()file_exists()。より速く見つけました。ファイル(ディレクトリではない)であることがわかっている場合は、代わりにそれを使用してください。
ジョナサン

1
奇妙なことに、「file_exists」の方が「is_file」よりも高速なようです。
weynhamz 2014年

7
これらの2つの関数の動作が異なるため、なぜ人々はどちらがより高速であるかに関心があります(受け入れられた回答で述べられているように、1つはそれがファイルまたはファイルではなくシンボリックリンクであるかどうかをテストします(ただし、ディレクトリではなくシンボリックリンクではありません)ディレクトリを指す)およびファイル(ディレクトリの場合もあります)かどうかの他のテスト
Brandin

2
@Brandin人々が興味を持っているのは、多くの状況でファイルまたはディレクトリをチェックしているかどうかがすでにわかっているため、存在するかどうかが唯一の重要なことだからです。したがってis_dir()file_exists()(それはそうではありませんが)よりも20%速いことが判明した場合、とにかくdirsのみをチェックしている場合、それは重要な違いになる可能性があります...
Byson

1

どちらでもない。

is_file()は、ファイルが存在しない場合にtrueを返すことができます。

file_exists()は、ファイルがディレクトリの場合にtrueを返すことができます。

したがって、それがファイルであり、存在する必要がある場合は、両方が必要です。

速度は同じではないため、ここでは重要ではありません。1つの機能のみが重要であり、それが高速になる場合は、1つだけを使用します。


1

私はこの投稿が古いことを知っていますが、この機能の違いはそれらの動作だけではありません。is_file()を使用して大きなファイルの存在を確認する場合、2 Go以上。あなたは驚きます。ファイルが存在しません。:(しかし、file_exists()でチェックすると、それは機能します。


0

is_fileバックスラッシュと一緒に使用すると高速になります:\is_file。この場合、PHPはopcache最適化を提供しfile_existsません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.