is_file o file_exists in PHP


117

Devo controllare se un file si trova su HDD in una posizione specificata ($ path. $ Nome_file).

Quale è la differenza tra is_file()e file_exists()funzioni e che è meglio / più veloce per l'uso in PHP?

Risposte:


167

is_file()restituirà falsese il percorso specificato punta a una directory. file_exists()restituirà truese il percorso specificato punta a un file o una directory validi . Quindi dipenderà interamente dalle tue esigenze. Se vuoi sapere nello specifico se si tratta di un file o meno, usa is_file(). Altrimenti, usa file_exists().


1
per quanto ne so, if_file fallisce anche per i collegamenti simbolici, non solo per le directory.
stefs

is_file () restituisce true se il file è presente nella directory o false se il file non esiste poiché controllo nel 2020 potrebbe essere la versione php aggiornarlo
heySushil

37

is_file()è il più veloce, ma il benchmark recente mostra che file_exists()è leggermente più veloce per me. Quindi immagino che dipenda dal server.

Il mio benchmark di prova:

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

Modifica: @Tivie grazie per il commento. Numero di cicli modificato da 1000 a 10k. Il risultato è:

  1. quando il file esiste :

    is_file x 10000 1,5651218891144 secondi

    file_exists x 10000 1.5016479492188 secondi

    is_readable x 10000 3,7882499694824 secondi

  2. quando il file non esiste :

    is_file x 10000 0,23920488357544 secondi

    file_exists x 10000 0,22103786468506 secondi

    is_readable x 10000 0,21929788589478 secondi

Modifica: clearstatcache spostato (); all'interno del ciclo. Grazie CJ Dennis.


7
affinché questo benchmark funzioni, è necessario aggiungere clearstatcache (); poiché i risultati per is_file e file_exists vengono memorizzati nella cache in tutto lo script. Ad ogni modo file_exists () è un po 'più lento, ma non dovrebbe fare alcuna differenza a meno che non si eseguano controlli sui file di circa 100K. php.net/manual/en/function.clearstatcache.php
Tivie

1
Anch'io ho trovato is_file()più veloce di file_exists(). Se sai che è un file (e non una directory), usalo sicuramente.
Jonathan

1
Strano, ora sembra che "file_exists" sia più veloce di "is_file".
weynhamz

7
Perché le persone sono interessate a quale è più veloce, perché queste due funzioni hanno comportamenti diversi (come menzionato nella risposta accettata, quella verifica se si tratta di un file o di un collegamento simbolico che punta a un file (ma non una directory e non un collegamento simbolico che punta a una directory) e l'altro verifica se si tratta di un file (che potrebbe anche essere una directory).
Brandin

2
@Brandin Le persone sono interessate perché in molte situazioni sai già se stai cercando un file o una directory, quindi se esiste è l'unica cosa importante. Quindi se is_dir()risulta essere il 20% più veloce di file_exists()(cosa che non fa, btw), questa può essere una differenza importante se stai comunque controllando solo le directory ...
Byson

2

Né.

is_file () può restituire true se il file non esiste.

file_exists () può restituire true se il file è una directory.

Quindi, se deve essere un file e deve esistere, allora hai bisogno di entrambi.

La velocità non ha importanza qui perché non sono la stessa cosa. Usane solo una se conta solo una funzione e sarà più veloce.


1

So che questo post è vecchio ma la differenza tra queste funzioni non è solo il loro comportamento. Se usi is_file () per verificare l'esistenza di file di grandi dimensioni, più di 2 Go. Sarai sorpresa. Il file non esiste. :( Ma se controlli con file_exists (), funziona.


0

is_filesarebbe più veloce se l'uso con backslash: \is_file. In questo caso PHP fornirà l'ottimizzazione opcache né lo file_existsfarà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.