坑爹的file_exists

坑爹的file_exists


 
 介绍
 
我发现了一个问题,今天与大家分享。我把整个过程描述一下。
 
问题
 

  公司有个框架是基于smarty写的,我负责php的升级,维护人员把新环境布上来之后,测试人员找我提出经常报错(错误:提示找不到文件的)。
  我追踪了一下代码,原来是smarty的这个地方报的错误。
  

坑爹的file_exists

  错误:这里报出文件不存在。

  思考过程:

  1、我原以为是程序里没有这个文件呢,结果发现,文件是有的,那是怎么回事?

  2、后来我再猜是不是php内核有问题,我把php的相关内核文件看了一遍,也没发现问题。结果我就把整个过程跟项目经理说去了。——事情也没解决,就这样先不了了之。升级的事情先耽误着。

  今天又发现这个问题,我第一反应是php版本是不是升级了,发现没有。——后来把整个目录设置成777就没事了(chmod 777 -R 目录)。我想是不是file_exists()方法问题。

  所以,我就进行了相关的调试和实验。 

坑爹的file_exists

 调试过程
 
调试代码:

坑爹的file_exists

目录:

坑爹的file_exists

 

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

坑爹的file_exists

坑爹的file_exists

运行结果:

坑爹的file_exists

 

坑爹的file_exists

 目录的执行权限影响file_exists()
 
1、给test一个最大的权限——755

坑爹的file_exists

 

坑爹的file_exists

坑爹的file_exists

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

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

我做了几个实验:

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

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

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

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

 

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

 

坑爹的file_exists

 

坑爹的file_exists

总结
 
在php手册上并没有提到,file_exists会受目录的执行权限影响。今通过此文告知那些也有这方面问题的开发者。仅以此为戒。
 
附加信息
 
感谢大家留的言,非常有用。经过大家的意见我再查了下手册,确实,如果目录没有执行权限,php-fpm应用进程就不能到这个目录下面去进行文件搜索,当然就认为文件不存在(实际是认为没有可执行的目录是不存在的)。
手册内容,大家可以一起斟酌一下,主要是执行权限。在这里就不详谈读写权限了(一般都很好理解)。

坑爹的file_exists

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

坑爹的file_exists

 
推荐
 
如果这篇文章对你有所帮助,或者也让你解决了此类问题,请推荐一把,让哥们有更强的写作动力。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114228.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java c++ socket 中文乱码解决「建议收藏」

    java c++ socket 中文乱码解决「建议收藏」java服务器端使用ServerSocket的accept创建Socket,跟普通java之间的通信一致。C++客户端使用makeConnect(server,port,”tcp”),send,recv等函数。 自己在这次编程中,首先遇到的是虽然连接成功了,但java无法接收C++发来的消息。可能是用错函数之类的,后边改为下边的代码接收就没事了。

    2022年7月13日
    11
  • MySQL导入sql文件的三种方法

    MySQL导入sql文件的三种方法文章目录一、使用工具NavicatforMySQL导入1.打开localhost_3306,选中右击“新建数据库”3.指定数据库名和字符集(可根据sql文件的字符集类型自行选择)3.选中数据库下的表运行SQL文件4.选中路径导入二、使用MySQLWorkbench导入(MySQL的官方工具)1、第一种方法①.新建一个数据库demo(名字任取),点击指示图标(或者File栏里面的OpenSQLScript…)②.选中路径导入SQL文件③.添加指定库名的命令,并点击运行注意:大概在15、16行

    2022年10月2日
    0
  • CSS3 transition实现手风琴效果「建议收藏」

    CSS3 transition实现手风琴效果「建议收藏」CSS3transition实现手风琴效果最近在项目中遇到了一个需求,需要完成一个手风琴效果的展示,最后通过CSS3transition实现了这个效果,下面就分享下实现方法。效果首先看下效果:可以看到,当我们点击toggle按钮的时候会实现一个带有动画的过渡效果。transition属性实现动画效果这要用到了transition的四个属性,分别是:transition-prope…

    2022年7月13日
    9
  • malloc函数具体解释

    malloc函数具体解释

    2021年11月29日
    53
  • 砸盘、销号、解散社群,Merlin Lab“跑路三连”暴露了DeFi哪些问题?

    砸盘、销号、解散社群,Merlin Lab“跑路三连”暴露了DeFi哪些问题?抛售代币、注销推特、微信群解散,昨夜BSC机枪池项目MerlinLab上演一出火速“大逃亡”。6月29日15点24分,MerlinLab遭到黑客攻击。据区块链安全公司PeckShield…

    2022年5月19日
    40
  • 几款常用UML建模工具解析[通俗易懂]

    本节向大家介绍几款常用UML建模工具,UML是个好东西,但是过分的依赖于UML也不是一件好事,因为有时候它会把简单的东西复杂化。请看下面详细介绍。常用UML建模工具UML不算是个新名词,但是实际中还是用得很少(可能是因为都是做小项目的原因吧,大项目就用得多了).UML是个好东西,但是过分的依赖于UML也不是一件好事,因为有时候它会把简单的东西复杂化.即使是代码的优良结构和可重用性也不能

    2022年4月6日
    128

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号