`

is_file file_exists的区别

    博客分类:
  • PHP
 
阅读更多

转自网络

 

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应用进程就不能到这个目录下面去进行文件搜索,当然就认为文件不存在(实际是认为没有可执行的目录是不存在的)。
手册内容,大家可以一起斟酌一下,主要是执行权限。在这里就不详谈读写权限了(一般都很好理解)。

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

相关推荐

    php中判断文件存在是用file_exists还是is_file的整理

    看了这篇PHP中file_exists与is_file,is_dir的区别的说法基本明白,PHP的 file_exists = is_dir + is_file。 写程序验证一下: 分别执行1000次,记录所需时间。 文件存在(当前目录) is_file:0.4570ms file_exists:2....

    PHP中is_file不能替代file_exists的理由

    这里我们将详细探讨这两个函数的工作原理以及为什么 `is_file` 不能替代 `file_exists`。 首先,`is_file` 函数的作用是检查指定的路径是否为一个普通文件,它返回 `true` 如果文件存在且是常规文件,否则返回 `...

    PHP中判断文件存在使用is_file还是file_exists?

    本文将对is_file()与file_exists()这两个函数进行深入探讨,并通过测试程序来验证在不同情况下使用哪一个函数更为合适。 首先,is_file()函数专门用于判断指定的文件是否存在并且是一个文件。它的参数是一个文件...

    PHP中file_exists与is_file,is_dir的区别介绍

    性能方面,根据手册,尽管这两个函数的结果都会被缓存,`is_file` 的执行速度通常比 `file_exists` 快很多。这是因为`is_file` 直接针对文件进行检查,而 `file_exists` 需要做额外的判断来确认路径是否为文件或目录...

    PHP中is_file&#40;&#41;函数使用指南

    function isfile($file){ return preg_match('/^[^.^:^?^-][^:^?]*.(?i)' . getexts() . '$/', $file); // 验证文件名是否符合特定格式和扩展名 } function getexts(){ // 列出可接受的文件扩展名 return '(app...

    check_file_exists_glob:检查文件是否存在

    file_exists_glob/master/check_file_exists_globchmod +x check_file_exists_globmv check_file_exists_glob /usr/lib64/nagios/plugins/ 示例输出OK: File 'asdfg*' is absent, good.OK: File 'asdf*' is present,...

    php is_file 判断给定文件名是否为一个正常的文件

    有时,开发者可能会混淆 `is_file()` 和 `file_exists()`,但它们在功能上是有区别的。例如,如果你只关心文件是否存在而不在乎它是否为文件,那么使用 `file_exists()` 就足够了。然而,如果你需要确保进行操作的是...

    php is_file&#40;&#41;和is_dir()用于遍历目录时用法注意事项

    3. 在遍历过程中,可以同时使用 `is_file()` 和 `is_dir()` 来区别处理文件和目录。 4. 如果需要检查路径是否存在,但并不关心它是文件还是目录,可以使用 `file_exists()`。 了解这些知识点后,你可以更有效地在 ...

    php中file_exists函数使用详解

    函数的基本语法为bool file_exists(string $filename),其中参数$filename是需要进行判断的文件或目录的路径。如果路径对应的文件或目录存在,函数返回true,反之返回false。 在使用file_exists函数时,需要注意...

    php 文件状态缓存带来的问题

    stat(),lstat(),file_exists(),is_writable(),is_readable(),is_executable(),is_file&#40;&#41;,is_dir(),is_link(),filectime(),fileatime(),filemtime(),fileinode(),filegroup(),fileowner(),...

    解析php file_exists无效的解决办法

    这种方法不仅可以解决Safe Mode带来的问题,还适用于`is_dir()`和`is_file()`等其他文件系统相关的函数,确保在受保护的环境下也能正确检测文件或目录的存在。 **原因二:文件权限问题** 在跨平台(如Windows和...

    php_file_operations_example_637405_filesystem_Windows编程_php_

    7. **文件属性**:`filemtime()`, `filesize()`, `is_file()`, `is_dir()`等函数用于获取文件的修改时间、大小、类型等信息。 8. **文件指针和流**:`fopen()`打开文件后,可以使用`fgets()`, `fseek()`, `rewind()...

    PHP中file_exists()判断中文文件名无效的解决方法

    然而,当文件名包含中文字符时,尤其是在UTF-8编码环境下,`file_exists()` 可能无法正常工作,导致判断失败。这是因为某些操作系统(如Linux、Apache等)在处理非ASCII字符(如中文字符)时可能存在兼容性问题。 ...

    php上传图片 方法

    file_exists('./'.$m_url)) { mkdir($m_url); } $img_path = empty($username)?$m_url:$m_url.$username.'/'; if($username){ if(!file_exists('./'.$img_path)){ mkdir($img_path); } }else...

    PHP中file_exists使用中遇到的问题小结

    - 使用`is_file`代替`file_exists`并不总是可行的,因为`is_file`只能检查文件,而不能检查目录,且同样会受到权限的影响。 总之,理解和掌握`file_exists`在不同环境下的行为对于排查这类问题至关重要。在开发过程...

Global site tag (gtag.js) - Google Analytics