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

3
我正在尝试让一个php文件写入到同一文件夹中的文件。这个php文件和它要写入的文件都设置了777的权限(它们在一个Linux服务器上),并且它们所在的文件夹也是如此。但是每当我用'w'或'w+'模式调用fopen()函数时,该函数就会返回false。由于这是我的学校Web服务器,所以我无法获取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文件系统的东西。

http://en.wikipedia.org/wiki/Andrew_File_System


1
你有收到任何错误吗?尝试将错误报告设置为 E_ALL(如果你还没有这样做),并将其设置为直接输出错误到页面(如果你无法访问 Apache 错误日志)。 - Amber
让我们看看相关的代码。在正确的目录中运行 ls -l 命令并输出结果也会很有帮助。 - Ewan Todd
实际上,应该使用 ls -la 命令来查看目录权限。 - MadCoder
5个回答

5

特兰诺尔,AFS是一个非常重要的线索。

AFS(安德鲁文件系统)拥有比传统Unix文件系统更高一级的目录权限。请检查目录上的AFS权限,以确保您有权访问目录中的文件。另外,可能并不是您的权限问题,而是Web服务器的权限问题(或者说它正在运行的用户ID)。由于我已经很久没有使用AFS了,所以我不知道检查目录权限的命令。


你说得对,这与AFS特定的权限有关。我在我们学校网站上找到了一篇说明如何设置权限的页面。我给了http用户(apache用户)写入权限,现在它可以正常工作了。谢谢。 - Telanor

3
请改为如下操作:
$fh = fopen($filename, "a");

我想问题在于你没有正确的目录权限。当你尝试删除文件时,需要在目录中拥有写入权限,使用"w"可以实现这一点。
或者,如果你需要截断/删除文件,请更改目录权限以获取写入权限。

使用'a'模式的fopen也无法工作。我已经递归地将整个/public_html/目录设置为777权限,但仍然无法从php写入该目录。 - Telanor
目录权限呢? - cletus

0
很可能php并不是以与文件所有者相同的用户身份运行的。您尝试使用php在目录中创建一个新文件了吗(只需在同一目录中创建一个随意命名的文件即可)?

PHP正在http用户下运行,这是一个不同于文件所有者的用户。尝试使用PHP创建文件会导致相同的问题。 - Telanor

0

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

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

在这一点上,假设您对服务器环境的控制有限,您应该向管理员请求更多信息。


0

就像MadCoder所说的那样。
来自AFS文档:

AFS ACL与标准Unix“所有者”权限一起工作。只有所有者权限对AFS文件访问产生影响;“组”和“其他”Unix权限不影响AFS文件访问。 这些规则适用。具有适当AFS权限的用户可以:
仅在UNIX“所有者读取”模式设置时读取文件。
仅在UNIX所有者“读取”和“写入”模式设置时向文件写入。
仅在UNIX所有者“读取”和“执行”模式设置时执行文件。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接