128

我需要检查文件是否在指定位置($path.$file_name)的 HDD 上。

is_file()和函数之间有什么区别,file_exists()在 PHP 中使用哪个更好/更快?

4

5 回答 5

186

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

于 2009-04-27T10:00:55.473 回答
39

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 秒

    文件存在 x 10000 1.5016479492188 秒

    is_readable x 10000 3.7882499694824 秒

  2. 当文件不存在时:

    is_file x 10000 0.23920488357544 秒

    文件存在 x 10000 0.22103786468506 秒

    is_readable x 10000 0.21929788589478 秒

编辑:移动 clearstatcache(); 循环内。谢谢 CJ 丹尼斯。

于 2012-05-09T13:07:58.080 回答
3

两者都不。

如果文件可以读取,is_file() 返回 true。

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

请注意,在某些边缘情况下,当 is_file() 由于权限或边缘情况文件系统问题而导致 is_file() 无法确定其是否为“常规文件”时,file_exists() 返回 true。

速度在这里无关紧要,因为它们不一样,它们会根据情况交换速度位置。

于 2020-03-18T20:56:43.473 回答
1

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

于 2020-07-27T08:45:13.440 回答
0

is_file如果与反斜杠一起使用会更快:\is_file. 在这种情况下,PHP 将提供 opcache 优化,也file_exists不会。

于 2020-07-14T10:52:56.077 回答