200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > php 如何判断文件 文件夹/目录是否存在(is_file与file_exists的区别 效率)

php 如何判断文件 文件夹/目录是否存在(is_file与file_exists的区别 效率)

时间:2023-08-19 03:06:45

相关推荐

php 如何判断文件 文件夹/目录是否存在(is_file与file_exists的区别 效率)

PHP获取文件绝对路径:

/haibo0668/article/details/105735928

TP5 例子:

//判断模板是存在,存在就调用新模板,不存在就调用默认模板 复制模型if($this->mid){$template='';if($this->menu_controller){$web_url = dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'view'.DIRECTORY_SEPARATOR.strtolower(request()->controller()).DIRECTORY_SEPARATOR.$this->menu_controller.'.html' ; //取得当前文件的上一层目录名,结果:E:/phpStudy/WWW//application/admin/// \dump($web_url);if(is_file($file)){//存在$template=strtolower($this->menu_controller);}}}else{$template='';}

is_file 判断文件是否存在并且检查指定的文件名是否是正常的文件;

file_exists 判断文件是否存在或者是目录是否存在;

is_dir 判断目录是否存在;

查看手册,虽然这两个函数的结果都会被缓存,但是is_file却快了N倍。

还有一个值得注意的:

文件存在的情况下,is_file比file_exists要快N倍;

文件不存在的情况下,is_file比file_exists要慢;

结论是,file_exits函数并不会因为该文件是否真的存在而影响速度,但是is_file影响就大了。

所以,第一次看py师兄的代码,发现他是这样用的:

if(file_exists(DATA_DIR.'~runtime.php') && is_file(DATA_DIR.'~runtime.php') && IS_DEPLOY){

include_once DATA_DIR.'~runtime.php';

}else{

……

}

大牛就是大牛,代码深刻呀

但是:

下面代码,

for($i=0; $i<10000; $i++){

is_file(__ROOT__ . '/App.php');

file_exists(__ROOT__ . '/App.php');

}

XDebug测试结果为:

php::is_file

————————————-

total self: 0.5ms

total cum: 0.5ms

calls: 10,000

php::file_exists

————————————-

total self: 41ms

total cum: 41ms

calls: 10,000

第一次使用,没有文件的时候使用file_exists判断,会比is_file快,以后依然还需要用到file_exists却比is_file慢非常多而且要两个函数都使用。那么~py的代码在那种情况在实在不值得参考,直接用is_file()就可以了

-----------------------------------------------------------------------------------------------

写php任何时候我都会想到效率,效率,因为你永远不知道运行你程序的网站的主机状况。

而且大部分主机都有iis ,cpu占用的限制,没有限制的主机还是别买了,呵呵

我一直以来都用file-exits 来判断文件是否存在,那天偶然发现有这么一说:is_file 比file_exits更快

写了一段代码测试了一下

$start_time = get_microtime();

for($i=0;$i<10000;$i++){

if(is_file('url.txt')) {

//do nothing;

}

}

echo 'is_file耗时-->'.(get_microtime() - $start_time).'<br>';

$start_time = get_microtime();

for($i=0;$i<10000;$i++){

if(file_exists('url.txt')) {

//do nothing;

}

}

echo 'file_exits-->'.(get_microtime() - $start_time).'<br>';

function get_microtime()//时间

{

list($usec, $sec) = explode(' ', microtime());

return ((float)$usec + (float)$sec);

}

上面是1w次的测试,你会发现一个神奇结果

1.如果url.txt确实是存在的

那么is_file大约耗时 0.007sec.

file_exists耗时0.16sec.

is_file函数的确速度惊人!

但是别高兴太早,看另外一种情况

2.如果url.txt确实不存在

is_file耗时0.53sec.

file_exists耗时0.21sec.

3.看起来file_exits函数并不会因为该文件是否真的存在而影响速度,但是is_file影响就大了。

提示和注释: is_file(file)函数的结果会被缓存。请使用clearstatcache()来清除缓存。

下面一段的主要内容是: file_exists()受到目录的执行权限影响

代码:

目录:

观察各个权限:test对www是没有任何权限的,而执行文件index.php有读写执行权限,包含文件test.txt有读写权限。

运行结果:

目录的执行权限影响file_exists()

1、给test一个最大的权限——755

既然成功了,说明file_exists()函数是受目录权限的限制的。

那什么样的目录权限影响file_exists()呢?

我做了几个实验:

1、文件的任何上级目录,只有写权限时报文件不存在;

2、文件的任何上级目录,只有读权限时也报文件不存在;

3、而当所有上级目录都有执行权限的时候,报文件是存在的,一切都正常。

结果,说明file_exists()在判断文件是否存在的时候是递归判断每个目录是不是有执行权限。

修改文件路径为相对路径,得出一样的结果。

总结

在php手册上并没有提到,file_exists会受目录的执行权限影响。今通过此文告知那些也有这方面问题的开发者。仅以此为戒。

附加信息

感谢大家留的言,非常有用。经过大家的意见我再查了下手册,确实,如果目录没有执行权限,php-fpm应用进程就不能到这个目录下面去进行文件搜索,当然就认为文件不存在(实际是认为没有可执行的目录是不存在的)。

手册内容,大家可以一起斟酌一下,主要是执行权限。在这里就不详谈读写权限了(一般都很好理解)。

明显手册中,对目录的执行权限有明确的指示。对目录的执行权限,就是拥有被搜索的权利。

————————————————

版权声明:本文为CSDN博主「362576256」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:/newzzorg/java/article/details/8363247

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。