is_file или file_exists в PHP

Мне нужно проверить, находится ли файл на жестком диске в указанном месте ($path.$file_name).

В чем разница между is_file() и file_exists() и какие лучше/быстрее использовать в PHP?


person Duncan Benoit    schedule 27.04.2009    source источник


Ответы (5)


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

person hbw    schedule 27.04.2009
comment
насколько я знаю, if_file также не работает для символических ссылок, а не только для каталогов. - person stefs; 27.04.2009
comment
is_file() возвращает true, если файл существует в каталоге, или false, если файл не существует, как я проверяю, в 2020 году может быть обновлена ​​версия php. - person heySushil; 29.03.2020
comment
file_exists() лучше было бы назвать path_exists() - person Jay Dadhania; 03.02.2021

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

Редактировать: @Tivie спасибо за комментарий. Изменено количество циклов с 1000 до 10к. Результат:

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

    is_file x 10000 1,5651218891144 секунды

    file_exists x 10000 1,5016479492188 секунд

    is_readable x 10000 3,7882499694824 секунды

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

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

    file_exists x 10000 0,22103786468506 секунд

    is_readable x 10000 0,21929788589478 секунд

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

person Yasen    schedule 09.05.2012
comment
чтобы этот бенчмарк работал, вы должны добавить clearstatcache(); поскольку результаты для is_file и file_exists кэшируются по всему скрипту. В любом случае, file_exists() немного медленнее, но не должен иметь никакого значения, если вы не выполните около 100 тысяч проверок файлов. php.net/manual/en/function.clearstatcache.php - person Tivie; 28.05.2012
comment
Я тоже нашел is_file() быстрее, чем file_exists(). Если вы знаете, что это файл (а не каталог), обязательно используйте его. - person Jonathan; 14.05.2013
comment
Странно, теперь кажется, что «file_exists» быстрее, чем «is_file». - person weynhamz; 10.03.2014
comment
Почему людей интересует, что быстрее, потому что эти две функции имеют разное поведение (как упоминалось в принятом ответе, одна проверяет, является ли это файлом или символической ссылкой, указывающей на файл (но не каталог и не символическая ссылка, которая указывает на каталог) и другие тесты, если это файл (который также может быть каталогом). - person Brandin; 27.10.2014
comment
@Brandin Люди заинтересованы, потому что во многих ситуациях вы уже знаете, проверяете ли вы файл или каталог, поэтому единственно важным является их существование. Так что, если is_dir() оказывается на 20% быстрее, чем file_exists() (что, кстати, не так), это может быть важным отличием, если вы все равно проверяете только каталоги... - person Byson; 13.07.2015

Ни один.

is_file() может вернуть true, если файл не существует.

file_exists() может вернуть true, если файл является каталогом.

Поэтому, если это должен быть файл, и он должен существовать, вам нужны оба.

Скорость здесь не имеет значения, потому что они не одинаковы. Используйте только один, если важна только одна функция, и это будет быстрее.

person Brad    schedule 18.03.2020
comment
При каких обстоятельствах is_file() возвращает true, если файл не существует? - person fritzmg; 02.09.2020

Я знаю, что этот пост устарел, но разница между этими функциями заключается не только в их поведении. Если вы используете is_file() для проверки существования большого файла, более 2 Go. Вы будете сюрпризом. Файл не существует. :( Но если вы проверите с помощью file_exists(), это сработает.

person Juan - 6510866    schedule 27.07.2020

is_file будет быстрее, если использовать его с обратной косой чертой: \is_file. В этом случае PHP обеспечит оптимизацию opcache и file_exists не будет.

person SpinyMan    schedule 14.07.2020