PHP中的is_file或file_exists


Answers:


167

is_file()false如果给定路径指向目录,则将返回。如果给定的路径指向有效的文件目录,file_exists()则将返回。因此,这完全取决于您的需求。如果您想具体知道它是否是文件,请使用。否则,请使用。trueis_file()file_exists()


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更改为10k。结果是:

  1. 文件存在时

    is_file x 10000 1.5651218891144秒

    file_exists x 10000 1.5016479492188秒

    is_可读x 10000 3.7882499694824秒

  2. 当文件不存在时

    is_file x 10000 0.23920488357544秒

    file_exists x 10000 0.22103786468506秒

    is_可读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 2014年

7
人们为什么对哪个更快感兴趣,因为这两个函数具有不同的行为(如已接受的答案所述,一个函数测试是文件还是指向文件的符号链接(而不是目录,而不是指向指向目录),其他则测试文件是否是文件(也可以是目录)
Brandin

2
@Brandin人们很感兴趣,因为在许多情况下,您已经知道要检查文件或目录,因此,是否存在是唯一重要的事情。因此,如果is_dir()事实证明file_exists()它比(快慢)快20%,那么无论如何,如果您仅检查dirs,那将是一个重要的区别……
Byson 2015年

1

都不行

如果文件不存在,则is_file()可以返回true。

如果文件是目录,则file_exists()可以返回true。

因此,如果它需要是一个文件并且需要存在,那么您同时需要两者。

这里的速度无关紧要,因为它们并不相同。如果只有一项功能很重要,请仅使用一项,这样会更快。


1

我知道这篇文章很老,但是这些功能之间的区别不仅在于它们的行为。如果使用is_file()检查大文件是否存在,则超过2个Go。你会感到惊讶。文件不存在。:(但是,如果您使用file_exists()检查,那是可行的。


0

is_file如果在反斜杠中使用它会更快\is_file。在这种情况下,PHP将不会提供操作缓存优化file_exists

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.