【问题标题】:file_put_contents php permissionsfile_put_contents php 权限
【发布时间】:2012-07-13 19:48:34
【问题描述】:

这是一个关于我的系统配置以及 apache/php 如何受此影响的问题。当我转移到生产环境时,在我的开发服务器上运行的代码无法运行,这就是我将错误归结为的问题。我想在 php 中使用 file_put_contents 来简单地在我的系统上创建一个文件。这是我正在使用的非常简单的代码:

print file_put_contents("testfile.txt","this is my test")?"made file":"failed";

没有错误被抛出,但它总是打印“失败”。当我在正常目录中运行它时,不会生成任何文件,但是当我将它移动到具有 777 权限的目录时,它会生成文件但仍会打印“失败”并且不保存任何内容。如果我将 php 文件本身更改为具有 777 权限,则没有任何变化。如果我将目标文件 (testtext.txt) 更改为具有 777 权限,则没有任何变化。

当我将 php 文件的所有者更改为与创建的 testfile.txt 相同时,没有任何变化。当我尝试相对路径与绝对路径时,没有任何变化。出于某种原因,我可以让 php 生成文件,但它始终是空的,并且使用 file_put_contents 我无法写入任何内容。

创建的文件位于“www-data”的所有者和组中,如果有帮助,我将作为 root 用户。我该怎么做才能让它工作?我认为我的 php 版本正在使用 suhosin 扩展,如果这可能与它有任何关系(或者如果你认为有办法在 php 或 suhosin ini 文件中解决这个问题,我也可以这样做)。

过去几天我一直在寻找这个。

编辑:基于以下 cmets 的更新。当我在 CLI 模式下运行它时 它确实可以工作 但是由于我需要通过 apache 运行它,我该如何使用这个事实?这是否告诉我们一些关于停止文件写入的位置或内容的信息?此外,file_put_contents 调用实际上返回“false”而不是零。

【问题讨论】:

  • 对包含此文件的文件夹拥有 www-data 用户 +w 和 +x 权限?你能 su 作为 www-data 并尝试写入这个文件吗?
  • file_put_contents() 返回成功写入时写入的字节数。如果它正在创建一个空文件,这可能是 0 字节,这将评估为虚假文件。这就是您看到“失败”消息的原因。请尝试使用 fopen() / fwrite() 路线。我预计不会有任何变化,但很好检查。
  • CLI 运行时脚本是否有效?
  • 是的,我刚刚在 CLI 中运行它并且它确实工作了——这对于权限的设置方式意味着什么,因为我必须让 apache 版本工作?当我通过 print file_put_contents("testfile.txt","this is my test")===false?"failed":"made file"; 修改以检查它返回的类型时,它实际上返回 false 而不是 0
  • echo (file_exists('testfile.txt')?'y':'n').getcwd();

标签: php apache file permissions


【解决方案1】:

您必须为 apache 用户设置权限为 777。 Apache 还需要能够“创建”新文件。我敢肯定,如果您尝试写入具有 777 权限的文件,它会起作用。

【讨论】:

  • 是的,似乎因为 CLI 可以工作,但 apache 不能,这是权限问题。在 Ubuntu Unix 中,如何向用户授予权限——而不是我习惯使用 chmod 执行的特定文件或文件夹?
  • 不确定。我正在使用 linux mint,在我的 natalus 中,它让我可以选择修改所有机器用户的权限,WWW-Data 就在那里。
  • 好吧,即使我还不能让它工作,我现在大约 95% 确定这是一个权限问题,因为 apache 没有写入这些文件的正确权限,所以我会接受这个答案。
  • 0777 的许可几乎从不需要也很少是一个好主意。相反,通常应该使用那些需要访问文件的帐户的组成员身份,甚至为特殊目的创建一个新的、定制的用户组,并授予该组的所有权和访问权限。
【解决方案2】:

函数返回写入文件的字节数,失败时返回 FALSE。

确保mydir 是可写的(由 apache 用户 - apache2 或 www-data)。要检查内容是否已写入文件,请使用 === 运算符:

$file = "mydir/testfile.txt";

$result = file_put_contents($file,"this is my test");

if ($result === false)
{
  echo "failed to write to $file";
}
else
{
  echo "successfully written $result bytes to $file";
}

为了调试,我建议在你的 php 文件的顶部定义这个:

error_reporting(-1);
ini_set('display_errors', true);

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 2011-08-24
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多