在 PHP 中是_file 还是 file

我需要检查一个文件是否在硬盘上的指定位置($path. $file _ name)。

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

61723 次浏览

如果给定的路径指向某个目录,则 is_file()将返回 false。如果给定的路径指向有效的文件 或者目录,file_exists()将返回 true。所以这完全取决于你的需要。如果您想知道 特别是是否是一个文件,请使用 is_file()。否则,使用 file_exists()

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 100001.5651218891144秒

    File _ vis x 100001.5016479492188秒

    Is _ readable x 100003.7882499694824秒

  2. 当文件 根本不存在:

    Is _ file x 100000.23920488357544秒

    File _ vis x 100000.22103786468506秒

    Is _ readable x 100000.21929788589478秒

编辑: 在循环中移动 clearstatcache () ; 谢谢 CJ Dennis。

都不是。

如果文件可以读取,is _ file ()返回 true。

如果文件是一个目录,file _ vis ()可以返回 true。

注意,在某些边缘情况下,当 is _ file ()由于权限或边缘情况文件系统问题而不能确定其是否为“常规文件”时,file _ vis ()返回 true。

速度在这里并不重要,因为他们是不一样的,他们会根据情况交换位置的速度。

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

我知道这个帖子很老了,但是这个函数之间的区别不仅仅在于他们的行为。 如果您使用 is _ file ()来检查大文件的存在,超过2去。您会感到惊讶。 文件不存在。 : ( 但是如果您使用 file _ vis ()检查,那就可以了。