PHP file_exists问题杂谈
问题
公司有个框架是基于smarty写的,我负责php的升级,维护人员把新环境布上来之后,测试人员找我提出经常报错(错误:提示找不到文件的)。
我追踪了一下代码,原来是smarty的这个地方报的错误。
错误:这里报出文件不存在。
思考过程:
1、我原以为是程序里没有这个文件呢,结果发现,文件是有的,那是怎么回事?
2、后来我再猜是不是php内核有问题,我把php的相关内核文件看了一遍,也没发现问题。结果我就把整个过程跟项目经理说去了。——事情也没解决,就这样先不了了之。升级的事情先耽误着。
今天又发现这个问题,我第一反应是php版本是不是升级了,发现没有。——后来把整个目录设置成777就没事了(chmod 777 -R 目录)。我想是不是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函数使用详解
说明: bool file_exists ( string $filename ) 如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE. 在Windows上,使用/ /计算机名/共享/文件名或 计算机名共享文件名,以检查网络共享文件. 在 Windows 中要用 //computername/share/filename 或者 \\computername\share\filename 来检查网络中的共享文件. 实例一 <?php $filename = '/j
-
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.0640ms 文件存在(绝对路径3层/www/hx/a/) is_file:0.4909ms file_exists:3.3500ms 文件存在(绝对路径5层/www/hx/a/b/c/) is_f
-
PHP中file_exists与is_file,is_dir的区别介绍
很显然file_exists是受了asp的影响,因为asp不但有fileExists还有folderExists,driverExists,那么PHP中file_exists是什么意思呢? PHP的 file_exists = is_dir + is_file 它既可以判断文件是否存在,又可以判断目录是否存在.但这样一个全面的函数执行效率非常低,就像asp中request不指定是form,还是get,cookies,所以结论是: ◦如果要判断目录是否存在,请用独立函数 is_dir(direct
-
PHP中is_file不能替代file_exists的理由
我们可以使用下面的代码测试一下: 复制代码 代码如下: <?php $filename = 'test.txt'; if (is_file($filename)) { echo "$filename exists!\n"; } else { echo "$filename no exists!\n"; } sleep(10); if (is_file($filen
-
PHP中file_exists函数不支持中文名的解决方法
一般来说PHP中常使用file_exists()判断某个文件或者文件夹是否存在,如果存在则返回true,否则返回false.但是该函数在网页使用UTF8编码的情况下,对于中文的文件名或者文件夹名不能返回正确值,始终返回false.经测试之后得出解决方法,分析造成这一情况的原因应该是编码不同而导致的PHP不能正确判断. 下面这段代码是不能够返回正确值的代码,无论文件是否在都返回不在: <?php; $file="/attachment/21/0/中文.rar"; $newfile
-
PHP中file_exists()判断中文文件名无效的解决方法
本文实例讲述了PHP中file_exists()判断中文文件名无效的解决方法.分享给大家供大家参考.具体方法如下: php中判断文件是否存在我们会使用file_exists函数或is_file函数,但在使用file_exists时如果你文件名或路径是中文在uft8编码文档时是无效.本文就来解决此问题,下面我们一起来看看. 定义和用法: file_exists() 函数检查文件或目录是否存在. 如果指定的文件或目录存在则返回 true,否则返回 false. 例子1 复制代码 代码如下: <?ph
-
解析php file_exists无效的解决办法
方法1 :据官方手册上描述若php教程的safe mode相关的设置过于苛刻,就会出现这样的情形:尽管文件真实存在也被误报,认为文件不存在. 由于服务器端的php.ini我们无法操纵,当用ini_set()也关闭不了safe mode模式,我们只有退而求其次,找一个更可靠.安全的检测方法来检测文件是否存在.我们可以借助 $_server['document_root'] 来加以实现.$_server['document_root'] 返回的是网站的根目录,该目录的最后一个子目录不包含目录标志符号
-
php file_exists 检查文件或目录是否存在的函数
说明 bool file_exists ( string $filename ) 如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE. 其实于php教程 file_exists 函数与 file_exists语法我们早就讲过了,下面我们来看看一下关于它的使用方法与实例吧 路径的文件或目录. 在Windows上,使用/ /计算机名/共享/文件名或 计算机名共享文件名,以检查网络共享文件. 在 Windows 中要用 //computername/share/fil
-
PHP file_exists问题杂谈
问题 公司有个框架是基于smarty写的,我负责php的升级,维护人员把新环境布上来之后,测试人员找我提出经常报错(错误:提示找不到文件的). 我追踪了一下代码,原来是smarty的这个地方报的错误. 错误:这里报出文件不存在. 思考过程: 1.我原以为是程序里没有这个文件呢,结果发现,文件是有的,那是怎么回事? 2.后来我再猜是不是php内核有问题,我把php的相关内核文件看了一遍,也没发现问题.结果我就把整个过程跟项目经理说去了.--事情也没解决,就这样先不了了之.升级的事情先耽误着. 今天
-
PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
思维导图 索引: Ø Move Method(搬移函数) Ø Move Field (搬移值域) Ø Extract Class (提炼类) Ø Inline Class (将类内联化,就是把当前的类合并到其他类中) Ø Hide Delegate (隐藏委托关系) Ø Remove Middle Man ( 移除中间人) Ø Introduce Foreign Method (引入外加函数) Ø Introduce Local Extension (引入本地扩展) 介绍 承接上文PHP 杂谈<
-
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
思维导图 介绍 前几篇系列文章,我比较关注的是<PHP 杂谈<重构-改善既有代码的设计>之一 重新组织你的函数>,但是我觉得我还是没有说清楚,我自己也有很多不理解的地方,而且这篇是我的第一篇这方面的文章,有很多的纰漏,所以我会经常性的去做修改,如果大家有好的意见不妨告知一.二. 今天谈得是"接口",此接口非"Interface",而是一个统称.我们一般可以把供别人使用的函数或者url(一般是用于提供数据)叫接口.--可能还有别的意思,毕竟我现
-
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
思维导图 介绍 承接上文的PHP 杂谈<重构-改善既有代码的设计>之 重新组织你的函数继续重构方面的内容. 这章主要针对数据的重构. 1.争论的声音--直接访问Field还是通过函数(Accessor)访问Field 2.修改Array为Object:当你看到一个Array很像一个数据结构,你可以使用Replace Array with Object,把Array变成一个对象.--数据结构更清晰. 专业术语 accessor:访问者,存储器--在本文翻译为"函数" dumb
-
PHP中file_exists使用中遇到的问题小结
介绍 我发现了一个问题,今天与大家分享.我把整个过程描述一下. 问题:公司有个框架是基于smarty写的,我负责php的升级,维护人员把新环境布上来之后,测试人员找我提出经常报错(错误:提示找不到文件的). 我追踪了一下代码,原来是smarty的这个地方报的错误. 错误:这里报出文件不存在. 思考过程: 1.我原以为是程序里没有这个文件呢,结果发现,文件是有的,那是怎么回事? 2.后来我再猜是不是php内核有问题,我把php的相关内核文件看了一遍,也没发现问题.结果我就把整个过程跟项目经理说去了
随机推荐
- 通过实例深入理解linux shell数组
- Python中请使用isinstance()判断变量类型
- Vue + Webpack + Vue-loader学习教程之相关配置篇
- Swift教程之继承详解
- BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
- C# 给站点指定位置的某种格式的图片添加水印
- ASP.NET中使用GridView实现分级显示的代码
- Symfony2之session与cookie用法小结
- Python编程入门之Hello World的三种实现方式
- 用CSS控制表格或单元格强制换行,防止表格被英文单词或中文撑大
- JQuery删除DOM节点的方法
- JS数组交集、并集、差集的示例代码
- Linux中对MySQL优化实例详解
- jQuery的$.proxy()应用示例介绍
- 详解PHP中的状态模式编程
- vue 实现复制内容到粘贴板clipboard的方法
- 对numpy 数组和矩阵的乘法的进一步理解
- 浅谈php使用curl模拟多线程发送请求
- elementUI select组件value值注意事项详解
- Linux部署python爬虫脚本,并设置定时任务的方法