我有一个虚拟的Arch Linux测试服务器,我的笔记本电脑上运行了XAMPP,即使权限设置为777,我也无法通过php创建新文件。以下是代码:
$CompleteFilepath = $AFilepath . '/filepath/filename.php';
$FileHandle = fopen($CompleteFilepath, 'c')
or
die ("cannot be opened for writing"); // Debug
之后显然有更多的代码,但它无关紧要,因为它总是在这里消失。我无法通过修改所有者和组设置来使其工作,所以我最终使用递归方式将所有内容(主根文件夹除外)设置为777,但它仍然无法正常工作。但是文件夹不是直接在根目录中创建的,所以没关系,对吗?
编辑: 我仍然不确定我做错了什么,但今天我将所有者设置为服务器并且它有效。我以为我曾尝试过,但也许不是。至少我可以继续开发,即使我最终需要更安全地配置我的生产服务器。
答案 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文档。