php 如何判断文件、文件夹/目录是否存在(is_file与file_exists的区别、效率)
PHP获取文件绝对路径:
https://blog.csdn.net/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/cms.fn321.cn/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 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/newzzorg/java/article/details/8363247
php 如何判断文件、文件夹/目录是否存在(is_file与file_exists的区别、效率)相关推荐
- MFC或C/C++中如何判断目录存在,文件/文件夹存在,亦或是文件夹存在,文件存在
判断的方式太多太多,这里暂时列举5中方式. 在文章开始之前,由于需要用到CString转char功能,所以先介绍一个CString转char的方法: 想知道更多参见CString与char *互转总结 ...
- Node.js复制/删除服务器端文件到指定目录文件夹下,并且预判是否存在该目录,如果没有,则递归创建该文件夹目录
注意,前情提示: 本代码基于<Node.js(nodejs)对本地JSON文件进行增.删.改.查操作(轻车熟路)> 传送门Node.js(nodejs)对本地JSON文件进行增.删.改.查 ...
- Python判断两个文件夹中互相不同的文件有哪些、判断一个文件夹相对于另外一个文件夹缺少了哪些文件
Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些文件 目录 Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些 ...
- php进入目录,php文件,文件夹(目录)操作函数总结
本文章来给各位同学总结一下在php中一些常用的文件夹/文件目录操作函数总结,这些只是简单的介绍一些基础方法做个备注. 1.创建目录(mkdir) bool mkdir (string $pathnam ...
- python检测文件夹中新增文件_python检测文件夹变化,并拷贝有更新的文件到对应目录的方法...
检测文件夹,拷贝有更新的文件到对应目录 2016.5.19 亲测可用,若有借鉴请修改下文件路径: 学习python小一个月后写的这个功能,属于初学,若有大神路过,求代码优化~ newcopy.py: ...
- js 删除服务器文件,Node.js复制/删除服务器端文件到指定目录文件夹下,并且预判是否存在该目录,如果没有,则递归创建该文件夹目录...
注意,前情提示: 本代码基于<Node.js(nodejs)对本地JSON文件进行增.删.改.查操作(轻车熟路)> 传送门https://blog.csdn.net/qq_37860634 ...
- php scandir 目录树,使用php scandir函数遍历文件夹目录和所有文件
使用php scandir函数遍历文件夹目录和所有文件 $dir = "."; //当前目录 list_file($dir); function list_file($dir){ ...
- 大数据之-Hadoop之HDFS的API操作_判断是文件还是文件夹---大数据之hadoop工作笔记0062
然后我们再来看看,利用hadoop的hdfs的java的api来判断,当前的给出的路径是个 文件夹还是个文件. 我们写一下代码,我们判断根目录下的所有文件,循环判断是文件还是文件并打印 可以看到我们执 ...
- Node.js折腾记一(改进):文件夹目录树获取
前言 这是第一个版本: 用来干什么:想干嘛干嘛 为什么写:写来玩,学习node.js文件系统相关api:树结构这种东西还是挺不错的,会用会造才是真的会 用了什么: fs.readdir(dir), f ...
最新文章
- 开启一个新的终端并执行特定的命令
- C#事件(event)解析
- 源码篇——AsyncTask机制
- 用二分类神经网络估算多分类神经网络迭代次数的经验公式
- 服务器网站目录,服务器网站目录
- 找出数组中两个只出现了一次的数
- SpringMVC 文件上传及下载
- java spi使用详解
- 统计字符个数的c语言程序设计,编写一个函数,由实参传来一个字符串,统计此字符串中字母,数字,空格和其他字符的个数。...
- Oracle常用SQL总结
- IPv4(分类编址)
- Nescafé2 月之谜 题解
- 数字共享平台赋能船舶行业数字化转型——CSBC,搭建行业数字生态链
- 广播、组播、单播区别与联系
- Android开发 ANR异常的解决(应用程序无响应)
- HDU1172 猜数字
- 常用一些缺失dll文件下载网址,最新版本的 Microsoft Visual C++ 的下载链接
- 视频文件(任意文件)二进制读写
- 知物由学 | Android应用破解与防护,阻断猖獗的应用乱象
- WebRTC音视频之噪音消除功能