is_file або file_exists в PHP


117

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

Яка різниця між is_file()і file_exists()функціями і які краще / швидше використовувати в PHP?

Відповіді:


167

is_file()повернеться, falseякщо даний шлях вказує на каталог. file_exists()повернеться, trueякщо даний шлях вказує на дійсний файл або каталог. Отже, це повністю залежатиме від ваших потреб. Якщо ви хочете конкретно дізнатися, чи це файл чи ні, використовуйте is_file(). В іншому випадку використовуйте file_exists().


1
наскільки я знаю, if_file також не працює для символічних посилань, а не лише каталогів.
stefs

is_file () return 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,50646479492188 секунд

    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 () трохи повільніше, але не повинно змінювати жодних змін, якщо ви не зробите близько 100K перевірок файлів. php.net/manual/en/function.clearstatcache.php
Tivie

1
Я теж знайшов is_file()швидше, ніж file_exists(). Якщо ви знаєте, що це файл (а не каталог), обов'язково використовуйте його замість нього.
Джонатан

1
Як не дивно, зараз здається, що "file_exists" швидше, ніж "is_file".
weynhamz

7
Чому людей цікавить, що швидше, тому що ці дві функції мають різну поведінку (як згадується у прийнятій відповіді, одна перевіряє, чи це файл чи символьне посилання, яке вказує на файл (але не на каталог, а не на символьне посилання, яке вказує на каталог) та інші тести, якщо це файл (який також міг би бути каталогом).
Брандін,

2
@Brandin Люди цікавляться тим, що в багатьох ситуаціях ви вже знаєте, чи перевіряєте ви файл чи каталог, тож чи існує він - єдине важливе. Тож, якщо is_dir()виявиться на 20% швидше, ніж file_exists()(що це не так, до речі), це може бути важливою різницею, якщо ви все одно перевіряєте на
дрірс

2

Ні.

is_file () може повернути true, якщо файл не існує.

file_exists () може повернути true, якщо файл - це каталог.

Отже, якщо він повинен бути файлом і він повинен існувати, то вам потрібно і те, і інше.

Швидкість тут не має значення, оскільки вони не однакові. Використовуйте лише одну, якщо важлива лише одна функція, і вона буде швидшою.


1

Я знаю, що ця посада стара, але різниця між цими функціями полягає не лише в їх поведінці. Якщо ви використовуєте is_file () для перевірки існування великого файлу, більш ніж 2 Go. Ви будете здивовані. Файл не існує. :( Але якщо ви перевірите файл_exists (), це працює.


0

is_fileбуде швидше , якщо використовувати його з зворотної косої межі: \is_file. У цьому випадку PHP забезпечить оптимізацію оптимізації, а file_existsтакож не буде.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.