is_file или file_exists в PHP

118

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

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

Дункан Бенуа
источник

Ответы:

168

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

HBW
источник
1
Насколько я знаю, if_file также не работает для символических ссылок, а не только для каталогов.
stefs
is_file () возвращает true, если файл существует в каталоге, или false, если файл не существует, как я проверяю в 2020 году, может быть версия php, обновить его
heySushil
37

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.

Лами
источник
7
для того, чтобы этот тест работал, вы должны добавить clearstatcache (); поскольку результаты для is_file и file_exists кэшируются по всему сценарию. В любом случае file_exists () работает немного медленнее, но не будет иметь никакого значения, если вы не выполните проверку файлов размером около 100К. php.net/manual/en/function.clearstatcache.php
Тиви,
1
Я тоже нашел is_file()быстрее чем file_exists(). Если вы знаете, что это файл (а не каталог), определенно используйте его.
Джонатан
1
Странно, теперь кажется, что file_exists быстрее, чем is_file.
weynhamz
7
Почему людей интересует, что быстрее, потому что эти две функции имеют разное поведение (как указано в принятом ответе, одна проверяет, является ли это файлом или символической ссылкой, указывающей на файл (но не каталогом, а не символической ссылкой, которая указывает на каталог), а другие проверяют, является ли это файлом (который также может быть каталогом).
Брандин,
2
@Brandin Людям интересно, потому что во многих ситуациях вы уже знаете , проверяете ли вы файл или каталог, поэтому важно только, существует ли он. Так что, если is_dir()окажется, что он на 20% быстрее, чем file_exists()(а это не так, кстати), это может быть важной разницей, если вы все равно проверяете только каталоги ...
Байсон,
2

Ни.

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

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

Так что, если это должен быть файл и он должен существовать, вам понадобятся оба.

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

штифтик
источник
1

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

Хуан - 6510866
источник
0

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

SpinyMan
источник