记录一次php rename() Permission denied 原因及解决方案

By | 2020年5月31日

问题描述:

2020年5月30号下午,在将一个需要php5.2版本的网站上传至刚买的一个香港的虚拟主机上;mysql、网站文件以及伪静态文件都配置好后,运行网站发现网站整个空白一片,此时的我是脑袋一篇空白,如同这个网站一样。

问题排查过程(很是苦逼):

然后就开始了一通找原因的工作中去了,一开始我是怀疑伪静态文件的问题;因为这个虚拟主机服务器环境是iis8.5+php5.2+mysql,而我本地测试的环境是nginx+php5.2+mysql。而nginx的伪静态配置是和iis完全不同的:

这个是nginx伪静态:

而这个是iis的:

看到没?这两个完全不同,所以一开始我完全认为我的iis伪静态文件写错了,一直花了近5个小时在伪静态上面下功夫,简直一个脑袋两个大!!!

后来实在没办法了,就去发起了一个工单,去问虚拟主机商的技术人员了,技术人员看来之后,也是懵了,找不到原因;所以最后我就回复了那个技术人员,说:好吧,我自己再研究研究吧(满脸无奈😔)。

后面我反复的对比了其他网站iis环境下的伪静态文件,发现我写的伪静态压根没有问题,所以我这才完全确定不是伪静态问题!!

接下来我的重心开始转到php本身了,此时我并没有想php版本问题,因为我本地测试的是php5.2,而线上环境我选的也是5.2,版本没有问题;所以我开始把目光转向php程序本身,猜测是不是我在上传之前不注意把部分源码不注意开掉了。

首先网站打开是空白的,没有报错,所以猜测是错误提示关闭了;然后我找到了网站入口文件,将错误提示打开了,然后网站界面上赫然出现下面错误提示:

根据字面意思就是rename函数对于文件没有写入修改权限。

上面这个提示是来源于smarty模板引擎的,因为模板引擎需要去缓存一些文件,所以必须得要有写入修改权限,此时得我很高兴,认为终于找到问题所在了;然后就屁颠的去把缓存文件夹的权限全部修改成任何人都可以作任何操作,就是为了看看是不是这个问题。

然而理想是美好的,现实是残酷的,问题并没有得到解决,界面上还是出现了上面的错误提示!

就这样我又测试找问题进行了差不多一个上午,这里说一下,发现伪静态没问题是在第二天,也就是2020年5月31日。

下午我吃饱喝足了,又开始了苦逼的排查问题,此时的我觉得是不是应该再换一个方向,既然更改权限没有作用,那换一个php版本呢?(这里解释一下,我买的虚拟主机是支持更改php版本的,它有5.2、5.4、5.6、7.0、7.1这几个版本可以更换)

问题得到解决:

于是我换了一个php7.1的版本测试了一下rename()函数在这个虚拟主机上能不能执行,结果已测试,我整个人都不好了,既然可以使用,此时的我在想,虽然可以用,但我的这个网站不支持php7呀,连php5.4都不支持,我该怎么办?该不会把整个网站源码重新修改该一下把,这个工程量太大了。

这时候我已经懵了,甚至在想,干脆一狠心一咬牙再买一个vps算了。

就在胡乱想的时候,我的小手也在胡乱点虚拟主机的php版本切换按钮,忽然点到了php5.2的另一个版本php5.2ISAPI版本,竟然网站可以正常访问了,rename权限问题解决了!

虽然我不知道这是怎么回事,但我的猜测是,可能php5.2ISAPI版本是适用于iis服务器的,而我之前选的是php5.2CGI版本。

结语:

虽然问题解决得很狗血,但我还是要记录下来,这个问题真的很无语,其实很多程序员遇到得很多问题并不是代码问题,最难解决的问题也不是代码问题,因为代码是死的,但人是活的,总会找到解决的方法;而最让人头疼的是各种各样的版本问题,最怕遇到的是一大串代码却需要去支持各种版本的服务环境,当遇到版本的时候,很多时候又找不到原因!

希望我此次遇到的问题能够帮助到其他遇到同样问题的苦命人!

发表评论

电子邮件地址不会被公开。 必填项已用*标注