1

我试图将 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 文件系统(http://en.wikipedia.org/wiki/Andrew_File_System)的东西。

4

5 回答 5

5

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

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

于 2009-12-09T06:33:55.413 回答
3

改为这样做:

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

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

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

于 2009-12-09T00:41:40.553 回答
0

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

于 2009-12-09T03:42:24.837 回答
0

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

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

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

于 2009-12-09T05:28:39.453 回答
0

这就像 MadCoder sais。来自 AFS 文档:“AFS ACL 与标准的 Unix“所有者”权限一起工作。只有所有者权限才会影响 AFS 文件访问;“组”和“其他”的 Unix 权限不会影响 AFS 文件访问。

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

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

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

于 2012-01-20T09:42:26.310 回答