PHP无法写入文件,即使它具有777权限

时间:2009-12-09 00:33:26

标签: php file-permissions

我试图让php文件写入驻留在同一文件夹中的文件。 php文件和它试图写入的文件都将其权限设置为777(它是一个linux服务器)以及它们所在的文件夹。每当我使用'w'或'w +'模式调用fopen()时,该函数只返回false。它在我学校的网络服务器上,所以我无法获得root权限,可以将文件的所有者更改为与apache相同的用户。有谁知道什么是错的?

更新: 作为测试,我使用的是这段代码:

$handle = fopen("test.txt", 'w');
if($handle === FALSE)
    echo "\nfailed";
else
    echo "\nsuccess";
fclose($handle);

现在启用错误报告的输出是:

Warning: fopen(test.txt) [function.fopen]: failed to open stream: Permission denied in /<snip>/public_html/test.php on line 58
failed
Warning: fclose(): supplied argument is not a valid stream resource in /<snip>/public_html/test.php on line 63

上面是我从php网站上为fileperms()函数复制的一些代码,它检查文本文件的权限,并报告-rwxrwxrwx

相关文件的ls -al输出为

ls -al *test*
-rwxrwxrwx   1 mag5     30          1475 Dec  9 00:02 test.php*
-rwxrwxrwx   1 mag5     30             8 Dec  8 14:54 test.txt*

此外我不确定这是否重要,但我的学校使用的是一个名为Andrew File系统的东西(http://en.wikipedia.org/wiki/Andrew_File_System)。

5 个答案:

答案 0 :(得分:5)

Telanor,AFS是一个非常大的线索。

AFS(安德鲁文件系统)具有超出传统unix文件系统的整个目录权限级别。检查目录上的AFS权限,以确保您能够访问目录中的文件。此外,它可能不是您的权限,而是Web服务器的权限(或者更确切地说是在其下运行的用户标识)。自从我使用AFS以来已经很长时间了,所以我不知道检查目录权限的命令。

答案 1 :(得分:3)

请改为:

$fh = fopen($filename, "a");

我想问题是你没有目录的正确权限。当您尝试删除文件时,您需要在目录中具有写入权限,“w”将执行此操作。

或者,如果您需要截断/删除文件,请更改目录权限,以便您具有写入权限。

答案 2 :(得分:0)

很可能php并不像文件所有者那样以同一个用户身份运行。您是否尝试使用php在目录中创建新文件(只需在同一目录中创建一个随机命名的文件)?

答案 3 :(得分:0)

有几个原因可能会失败。根据周围的信息,它不是文件权限的问题。第一种,也可能是最有可能的是,您的Web服务器在一个配置中运行,它具有对整个文件系统的只读访问权限。这可能是因为NFS以只读方式挂载,或者因为PHP或服务器的配置方式会阻止写入。

另外,请永远不要将文件设置为777.即使666也足够危险。在像学校服务器这样的共享环境中尤其如此。

此时,假设您对服务器环境的控制有限,您应该向管理员询问更多信息。

答案 4 :(得分:0)

就像MadCoder sais。 来自AFS文件: “AFS ACL与标准Unix”所有者“权限一起使用。只有所有者权限对AFS文件访问有影响;”group“和”other“的Unix权限不影响AFS文件访问。

这些规则适用。具有适当AFS权限的用户可以:

仅在设置了UNIX“所有者读取”模式时才读取文件。 仅当设置了UNIX所有者“读取”和“写入”模式时才写入文件。 仅当设置了UNIX所有者“读取”和“执行”模式时才执行文件。“

要设置AFS权限,您需要使用“fs setacl”命令。