2009-04-27 2 views

ответ

132

is_file() вернет false, если данный путь указывает на каталог. file_exists() вернет true, если данный путь указывает на действительный файл или. Таким образом, это будет полностью зависеть от ваших потребностей. Если вы хотите знать конкретно, если это файл или нет, используйте is_file(). В противном случае используйте file_exists().

+1

Насколько я знаю, if_file также не работает для символических ссылок, а не только для каталогов. – stefs

+36

Просто прошел быстрый тест, и он действительно разрешает символическую ссылку. – hbw

30

is_file() является самым быстрым, но недавним эталоном показывает, что file_exists() немного быстрее для меня. Поэтому я думаю, это зависит от сервера.

Мой тест тест:

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 спасибо за комментарий. Изменено количество циклов от 1000 до 10k. Результат:

  1. когда файл существует:

    is_file х 10000 +1,5651218891144 секунд

    file_exists х 10000 +1,5016479492188 секунд

    is_readable х 10000 +3,7882499694824 секунд

  2. когда файл не существует:

    is_file х 10000 +0,23920488357544 секунды

    file_exists х 10000 +0,22103786468506 секунды

    is_readable х 10000 +0,21929788589478 секунды

Редактировать: clearstatcache перемещена(); внутри цикла. Спасибо CJ Деннис.

+5

, чтобы этот тест работал, вы должны добавить clearstatcache(); поскольку результаты для is_file и file_exists кэшируются по всему сценарию. Anyways file_exists() немного медленнее, но не должен иметь никакого значения, если вы не выполняете проверки файлов 100K. http://www.php.net/manual/en/function.clearstatcache.php – Tivie

+1

Я тоже нашел 'is_file()' быстрее, чем 'file_exists()'. Если вы знаете, что это файл (а не каталог), определенно используйте его. – Jonathan

+1

Нечетный, теперь кажется, что «file_exists» быстрее, чем «is_file». – weynhamz

Смежные вопросы