is_file oder file_exists in PHP

116

Ich muss überprüfen, ob sich eine Datei an einem bestimmten Speicherort auf der Festplatte befindet ($ path. $ File_name).

Was ist der Unterschied zwischen is_file()und file_exists()Funktionen und welche ist besser / schneller in PHP zu verwenden?

Duncan Benoit
quelle

Antworten:

166

is_file()wird zurückgegeben, falsewenn der angegebene Pfad auf ein Verzeichnis verweist. file_exists()wird zurückgegeben, truewenn der angegebene Pfad auf eine gültige Datei oder ein gültiges Verzeichnis verweist . Es würde also ganz von Ihren Bedürfnissen abhängen. Wenn Sie wissen wollen, speziell wenn es sich um eine Datei oder nicht ist , verwenden is_file(). Andernfalls verwenden Sie file_exists().

hbw
quelle
1
Soweit ich weiß, schlägt if_file auch für symbolische Links fehl, nicht nur für Verzeichnisse.
Stefs
is_file () return true , wenn die Datei im Verzeichnis oder falsch liegt vor , wenn Datei nicht existiert , als ich im Jahr 2020 überprüfen könnte es PHP - Version zu aktualisieren sein
heySushil
35

is_file()ist der schnellste, aber der jüngste Benchmark zeigt, dass er file_exists()für mich etwas schneller ist. Ich denke, es hängt vom Server ab.

Mein Testbenchmark:

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 danke für den Kommentar. Die Anzahl der Zyklen wurde von 1000 auf 10k geändert. Das Ergebnis ist:

  1. wenn die Datei existiert :

    is_file x 10000 1.5651218891144 Sekunden

    file_exists x 10000 1.5016479492188 Sekunden

    is_readable x 10000 3.7882499694824 Sekunden

  2. wenn die Datei nicht existiert :

    is_file x 10000 0,23920488357544 Sekunden

    file_exists x 10000 0.22103786468506 Sekunden

    is_readable x 10000 0,21929788589478 Sekunden

Bearbeiten: clearstatcache () verschoben; innerhalb der Schleife. Danke CJ Dennis.

Lamy
quelle
6
Damit dieser Benchmark funktioniert, sollten Sie clearstatcache () hinzufügen. da die Ergebnisse für is_file und file_exists im gesamten Skript zwischengespeichert werden. Wie auch immer, file_exists () ist etwas langsamer, sollte aber keinen Unterschied machen, es sei denn, Sie führen etwa 100.000 Dateiprüfungen durch. php.net/manual/en/function.clearstatcache.php
Tivie
1
Ich habe auch is_file()schneller gefunden als file_exists(). Wenn Sie wissen, dass es sich um eine Datei (und nicht um ein Verzeichnis) handelt, verwenden Sie sie auf jeden Fall stattdessen.
Jonathan
1
Seltsam, jetzt scheint 'file_exists' schneller zu sein als 'is_file'.
Weynhamz
7
Warum interessieren sich Leute dafür, was schneller ist, weil diese beiden Funktionen unterschiedliche Verhaltensweisen haben (wie in der akzeptierten Antwort erwähnt, testet die eine, ob es sich um eine Datei oder einen Symlink handelt, der auf eine Datei verweist (aber nicht um ein Verzeichnis und nicht um einen Symlink, der zeigt auf ein Verzeichnis) und die anderen Tests, ob es sich um eine Datei handelt (die auch ein Verzeichnis sein kann).
Brandin
2
@Brandin Die Leute sind interessiert, weil Sie in vielen Situationen bereits wissen, ob Sie nach einer Datei oder einem Verzeichnis suchen. Ob es also existiert, ist das einzig Wichtige. Wenn is_dir()sich herausstellt, dass es 20% schneller ist als file_exists()(was übrigens nicht der Fall ist), kann dies ein wichtiger Unterschied sein, wenn Sie sowieso nur nach Dirs suchen ...
Byson
1

Weder.

is_file () kann true zurückgeben, wenn die Datei nicht vorhanden ist.

file_exists () kann true zurückgeben, wenn die Datei ein Verzeichnis ist.

Wenn es also eine Datei sein muss und existieren muss, brauchen Sie beides.

Geschwindigkeit spielt hier keine Rolle, weil sie nicht gleich sind. Verwenden Sie nur eine, wenn nur eine Funktion wichtig ist und diese schneller ist.

Brad
quelle
0

is_filewäre schneller, wenn es mit Backslash verwendet werden : \is_file. In diesem Fall bietet PHP eine Opcache-Optimierung und file_existswird dies auch nicht tun .

SpinyMan
quelle
0

Ich weiß, dass dieser Beitrag alt ist, aber der Unterschied zwischen diesen Funktionen liegt nicht nur in ihrem Verhalten. Wenn Sie is_file () verwenden, um das Vorhandensein einer großen Datei zu überprüfen, werden mehr als 2 Go ausgeführt. Sie werden überrascht sein. Datei existiert nicht. :( Aber wenn Sie mit file_exists () prüfen, funktioniert das.

Juan - 6510866
quelle