2009-04-27 10 views

Odpowiedz

132

is_file() powróci false jeżeli dana ścieżka wskazuje na katalog. file_exists() powróci true jeżeli dana ścieżka wskazuje na prawidłowy plik lub katalogu. Więc to zależy wyłącznie od twoich potrzeb. Jeśli chcesz wiedzieć konkretnie jeśli jest to plik lub nie, użyj is_file(). W przeciwnym razie użyj file_exists().

+1

O ile mi wiadomo, nie if_file również dowiązania symboliczne, nie tylko katalogów. – stefs

+36

Po prostu uruchomiłem szybki test, który rzeczywiście rozwiązuje dowiązanie symboliczne. – hbw

30

is_file() to najszybszy, ale niedawny benchmark pokazuje, że file_exists() jest dla mnie nieco szybszy. Więc myślę, że to zależy od serwera.

Moja testów:

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"; 
} 

Edit: @Tivie dzięki za komentarz. Zmieniono liczbę cykli z 1000 na 10k. Wynikiem jest:

  1. gdy plik istnieje:

    is_file x 10000 1,5651218891144 sekund

    file_exists x 10000 1,5016479492188 sekund

    is_readable x 10000 3,7882499694824 sekund

  2. gdy plik nie istnieje:

    is_file x 10000 0,23920488357544 sekund

    file_exists x 10000 0,22103786468506 sekund

    is_readable x 10000 0,21929788589478 sekund

Edycja: przeniesiony clearstatcache(); wewnątrz pętli. Dzięki CJ Dennis.

+5

w celu odniesienia do tego, aby pracować, należy dodać clearstatcache(); ponieważ wyniki dla pliku is_file i file_exists są buforowane w całym skrypcie. Anyways file_exists() jest nieco wolniejszy, ale nie powinno robić żadnej różnicy, chyba że wykonasz około 100K kontroli plików. http://www.php.net/manual/en/function.clearstatcache.php – Tivie

+1

Również znalazłem 'is_file()' szybciej niż 'file_exists()'. Jeśli wiesz, że to plik (a nie katalog), zdecydowanie używaj go zamiast tego. – Jonathan

+1

Dziwne, teraz wygląda na to, że 'file_exists' jest szybszy niż 'is_file'. – weynhamz