is_file lub file_exists w PHP

117

Muszę sprawdzić, czy plik znajduje się na dysku twardym w określonej lokalizacji ($ path. $ File_name).

Który jest różnicą pomiędzy is_file()i file_exists()funkcji i co jest lepsze / szybsze do użytku w PHP?

Duncan Benoit
źródło

Odpowiedzi:

167

is_file()zwróci, falsejeśli podana ścieżka wskazuje na katalog. file_exists()zwróci, truejeśli podana ścieżka wskazuje na prawidłowy plik lub katalog. Więc to zależy całkowicie od twoich potrzeb. Jeśli chcesz wiedzieć konkretnie , czy jest to plik lub nie, użyj is_file(). W przeciwnym razie użyj file_exists().

hbw
źródło
1
o ile wiem, if_file również nie działa w przypadku dowiązań symbolicznych, a nie tylko katalogów.
stefs
is_file () zwraca true, jeśli plik istnieje w katalogu lub false, jeśli plik nie istnieje, ponieważ sprawdzam w 2020, może to być wersja php, zaktualizuj ją
heySushil
37

is_file()jest najszybszy, ale ostatnie testy porównawcze pokazują, że file_exists()jest dla mnie nieco szybszy. Więc myślę, że to zależy od serwera.

Mój test porównawczy:

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

Edycja: @Tivie dzięki za komentarz. Zmieniono liczbę cykli z 1000 na 10k. Wynik to:

  1. kiedy plik istnieje :

    is_file x 10000 1,5651218891144 sekund

    file_exists x 10000 1,5016479492188 sekund

    is_readable x 10000 3,7882499694824 sekundy

  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: przeniesiono clearstatcache (); wewnątrz pętli. Dzięki CJ Dennis.

Lamy
źródło
7
aby ten wzorzec działał, należy dodać clearstatcache (); ponieważ wyniki dla is_file i file_exists są buforowane w całym skrypcie. W każdym razie file_exists () jest nieco wolniejsze, ale nie powinno robić żadnej różnicy, chyba że wykonasz około 100K sprawdzeń plików. php.net/manual/en/function.clearstatcache.php
Tivie
1
Ja też znalazłem is_file()szybciej niż file_exists(). Jeśli wiesz, że to plik (a nie katalog), zdecydowanie użyj go zamiast tego.
Jonathan
1
Dziwne, teraz wygląda na to, że „file_exists” jest szybsze niż „is_file”.
weynhamz
7
Dlaczego ludzie są zainteresowani tym, co jest szybsze, ponieważ te dwie funkcje mają różne zachowania (jak wspomniano w akceptowanej odpowiedzi, ta sprawdza, czy jest to plik lub dowiązanie symboliczne wskazujące na plik (ale nie katalog, a nie łącze symboliczne, które wskazuje katalog) i inne testy, jeśli jest to plik (który może być również katalogiem).
Brandin,
2
@Brandin Ludzie są zainteresowani, ponieważ w wielu sytuacjach już wiesz, czy szukasz pliku lub katalogu, więc to, czy istnieje, jest jedyną ważną rzeczą. Więc jeśli is_dir()okaże się, że jest 20% szybszy niż file_exists()(a przy okazji nie jest), może to być istotna różnica, jeśli i tak sprawdzasz tylko
reżery
2

Ani.

is_file () może zwrócić prawdę, jeśli plik nie istnieje.

file_exists () może zwrócić prawdę, jeśli plik jest katalogiem.

Więc jeśli musi to być plik i musi istnieć, potrzebujesz obu.

Szybkość nie ma tutaj znaczenia, ponieważ nie są takie same. Użyj tylko jednej, jeśli tylko jedna funkcja ma znaczenie, a będzie szybsza.

Ćwiek
źródło
1

Wiem, że ten post jest stary, ale różnica między tymi funkcjami to nie tylko ich zachowanie. Jeśli używasz is_file () do sprawdzenia istnienia dużego pliku, więcej niż 2 Go. Będziesz zaskoczony. Plik nie istnieje. :( Ale jeśli sprawdzisz za pomocą file_exists (), to działa.

Juan - 6510866
źródło
0

is_filejeśli używać go z backslash będzie szybciej: \is_file. W tym przypadku PHP zapewni optymalizację opcache ani file_existsnie.

SpinyMan
źródło