2013-02-13 115 views
1

我有我的笔记本电脑上运行的XAMPP虚拟Arch Linux的测试服务器,我不能让PHP创建新的文件,即使设定在777以下权限的代码:即使拥有777权限,为什么PHP不能创建文件?

$CompleteFilepath = $AFilepath . '/filepath/filename.php'; 
$FileHandle = fopen($CompleteFilepath, 'c') 
    or 
die ("cannot be opened for writing"); // Debug 

有明显更多代码之后,但它是无关紧要的,因为它总是在这里死去。我无法通过修改所有者和组设置来实现它,所以我最终采用递归方式将所有内容(主根文件夹除外)设置为777,并且仍然无法工作。但该文件夹不是直接在根目录下创建的,所以它应该没关系,对吧?

编辑: 我仍然不确定我做错了什么,但今天我把所有者设置为服务器,它的工作。我以为我曾尝试过,但也许不是。至少我可以继续开发,即使我需要更安全地配置我的生产服务器。

+2

请告诉我的错误日志说? – 2013-02-13 01:39:29

+0

'$ CompleteFilepath'的完整路径是什么?你可以在自己的脚本之外打开它吗? – JakeGould 2013-02-13 01:40:24

+0

在错误消息中打印完整的文件路径。是的,包含文件夹中的“777”应该足够了。 – mario 2013-02-13 01:40:26

回答

0

PHP有一个名为open_basedir的指令,它允许将文件系统上的访问限制到指定的目录树。

例如,如果你在你的php.ini

open_basedir = /srv/http/:/home/:/tmp/ 

,你会访问该文件/filepath/filename.php,则必须设置:

open_basedir = /srv/http/:/home/:/tmp/:/filepath/ 

否则PHP将无法访问该文件。

通过这种方式,让这台机器上运行的所有PHP代码访问/filepath/目录树,所以它是不用于生产环境的安全。更好的方法是设置虚拟主机基于open_basedirhttpd.conf。我让你检查一下你的HTTP服务器文档,也可以查看这个文档的open_basedir

+0

谢谢。我已经重写了生产代码(它现在使用mod_rewrite),但是当我问这个问题时,这就是我正在寻找的东西。 – Adam11 2013-04-25 21:40:28

0

什么PHP版本正在运行,afaik选项'c'只适用于PHP 5.2.6及更高版本。

或短:确实

$FileHandle = fopen($CompleteFilepath, 'w'); 

工作?

+0

我正在运行5.4.7,所以这不应该是一个问题。 – Adam11 2013-02-13 02:01:53

0

嗯,我把所有者设置到服务器,现在它的工作。我以为我已经尝试过,但显然不是。仍然不确定我做错了什么,但至少现在它可以工作,所以我可以继续开发。

0

我有一个干净安装的CentOS 7的类似问题。事实证明,它默认安装了SELinux,即使在目录权限正确的情况下,它也可以防止所有PHP写入。

如果安装了SELinux

测试:sestatus

认沽SELinux的在许可模式:setenforce 0