为什么PHP不能创建文件,即使拥有777权限?

时间:2013-02-13 01:36:25

标签: php xampp file-permissions archlinux

我有一个虚拟的Arch Linux测试服务器,我的笔记本电脑上运行了XAMPP,即使权限设置为777,我也无法通过php创建新文件。以下是代码:

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

之后显然有更多的代码,但它无关紧要,因为它总是在这里消失。我无法通过修改所有者和组设置来使其工作,所以我最终使用递归方式将所有内容(主根文件夹除外)设置为777,但它仍然无法正常工作。但是文件夹不是直接在根目录中创建的,所以没关系,对吗?

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

4 个答案:

答案 0 :(得分:2)

我在安装CentOS 7时遇到了类似的问题。事实证明它默认安装了SELinux,即使目录权限正确也阻止了所有PHP写入。

测试是否安装了SELinux:sestatus

将SELinux置于许可模式:setenforce 0

答案 1 :(得分:0)

运行什么php版本,afaik选项'c'仅适用于php 5.2.6及更高版本。

或简称:

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

工作?

答案 2 :(得分:0)

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

答案 3 :(得分: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_basedir中设置基于httpd.conf虚拟主机。我让你检查你的HTTP服务器文档以及open_basedir文档。

相关问题