2009-04-27 17 views

risposta

132

is_file() restituirà false se il percorso indicato punta a una directory. file_exists() restituirà true se il percorso indicato punta a una directory di file valida o. Quindi, dipenderebbe interamente dalle tue esigenze. Se si desidera conoscere in particolare se si tratta di un file o meno, utilizzare is_file(). Altrimenti, utilizzare file_exists().

+1

per quanto ne so, if_file ha esito negativo anche per i collegamenti simbolici, non solo per le directory. – stefs

+36

Ho appena eseguito un test rapido e in effetti risolve il collegamento simbolico. – hbw

30

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

Il mio test di benchmark:

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 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 secondo

    file_exists x 10000 1,5016479492188 secondi

    is_readable x 10000 3,7882499694824 secondi

  2. quando il file non esiste:

    is_file x 10000 ,23920488357544 secondi

    file_exists x 10000 ,22103786468506 secondi

    is_readable x 10000 ,21929788589478 secondi

Edit: spostati clearstatcache(); all'interno del ciclo. Grazie CJ Dennis.

+5

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

+1

Anch'io ho trovato 'is_file()' più veloce di 'file_exists()'. Se sai che si tratta di un file (e non di una directory), utilizzalo sicuramente. – Jonathan

+1

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