日期:2014-05-16  浏览次数:20372 次

is_file()与file_exists()的区别

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);