【问题标题】:Can't seem to get correct permissions for mkdir() in PHP似乎无法在 PHP 中获得 mkdir() 的正确权限
【发布时间】:2012-02-19 19:19:54
【问题描述】:

我有以下简单的脚本来测试 PHP 中的 mkdir() 函数:

<?php
  $id = rand();

  $targetPath = $_SERVER['DOCUMENT_ROOT'] . '/sample_folder/' . $id .'/';
  mkdir(str_replace('//','/',$targetPath), 0755, true);
?>

理想情况下,每次脚本在我的 web 目录/sample_folder 下运行时,这都会创建一个随机文件夹。 Sample_folder 有 755 个权限。

我面临的问题是,我一直遇到 PHP:mkdir() Permission denied 问题。我的 sample_folder 权限当前设置为 chmod 755。

一切我已经阅读了不将 chmod 更改为 777 的状态,所以请不要建议。

出于测试目的,chmod 777 'sample_folder' 目录解决了这个问题,但这又会带来安全问题。关于如何完成这项工作,我还有什么遗漏吗?

注意:我系统上的PHP用户是“apache”;

我在 Media Temple 专用虚拟服务器上运行 PHP 5.3.* 和 CentOS 5.5 以供参考。我还查看了几乎所有关于 SO 的 chmod 问题,似乎找不到与我的问题相匹配的解决方案(777 条建议除外)。

编辑

在我的服务器上运行 ls -la 会返回:

drwxr-xr-x 2 ftphiddenname psacln 4096 Jan 26 11:24 sample_folder

最终更新

提供的答案非常有帮助。对于任何寻找更多信息的人,我看到了这篇知识库文章,虽然它在 Media Temple 上列出,但我相信这些原则适用于任何最相似的配置:

(dv):Resolve Apache permission errors

【问题讨论】:

  • 而不是chmoding,您需要chown 以确保755 足以让您修改相关目录。您需要父目录上的 7 (6?) 才能执行此操作 - 因此,如果父目录不属于 PHP 正在执行的用户,它不会让您使用 755 .
  • @DaveRandom - 感谢您的注意。老实说,我对 php 相当精通,但有时在使用 linux 服务器时遇到一些麻烦。如果需要,是否有特定的命令来查找此信息和地址?顺便说一句,我的 php 用户是“apache”。
  • 如果您在父目录的父目录中ls -l,您可以看到父目录的权限和所有权(如果您遵循这一点,如果您没有这样做,我会原谅您)。本质上,在您的示例中,您应该 ls -l 文档根目录,您将看到您想要的信息。你真正需要做的(作为一个有权限的用户)就是chown apache &lt;document root&gt;/sample_folder
  • @DaveRandom - 非常感谢。文件夹上的 chown 命令正是需要的。我将发布一个指向我刚刚找到的特定知识库文章的链接,但有没有办法在未来防止这种情况发生,或者在一次性情况下总是需要修复?
  • 该文件夹将被分配到创建用户的所有权 - 查看您在上面发布的输出,我猜您是通过 FTP 创建的,每次执行此操作都会有这个问题。为避免这种情况,您需要将目录创建为 apache 用户(使用 PHP 创建的任何东西都应该这样做),或者在创建目录时将它们 chown 设置为 apache

标签: php apache permissions chmod mkdir


【解决方案1】:

您是否检查了您尝试在其下创建目录的文件夹的文件系统权限?

您应该cd 进入目录并ls -la 以查看当前的所有权和文件系统权限:

paulbain@test ~/test $ ls -la
total 8
drwxr-xr-x  2 paulbain apache 4096 Jan 26 17:38 .

在我上面的示例中,它的所有者是 Read Write Execute、Group Read and Execute 和 Everyone Read and Execute。

如果是这种情况,并且您的 Apache 在组 apache 中的用户下运行,PHP 将无法创建目录。

【讨论】:

    【解决方案2】:

    原因是脚本需要对 sample_folder 的写入权限。

    我不知道您的实际设置,但我猜您的脚本要么在世界权限下运行,要么在组权限下运行,即 5(读取 4 + 执行 1),因为您当前的权限为 755(所有者为 7, 5 组,5 组世界)。要将目录写入该文件夹,您的脚本将需要写入权限。如果您有权访问 chown 目录,则可以比 777 更安全地进行设置。我的建议是创建一个名为“webgroup”或类似名称的组,并将您的网络服务器用户放入该组。然后,一旦您进行了设置,授予组写入权限 (770) 将是合适的。如果您对权限的工作方式有点模糊,最终设置将是:

    sample_folder:由 root 拥有,组 webgroup,770 权限 添加任何用户 apache(或其他网络服务器)正在运行的 webgroup

    编辑:

    在最初的帖子中提供了更多详细信息,这意味着您要将用户“apache”添加到 webgroup。如果你觉得这个设置太难了,或者你在服务器上没有完全的权限来设置它,那么按照其他地方的建议使用 chown 让 apache 拥有该目录也可以。

    例如:chown apache sample_folder

    这将使apache成为文件夹的所有者,赋予它写权限(假设它仍然是755)

    【讨论】:

    • 请注意,sample_folder 目前有 755 个权限。
    • 确实,这可能是你的脚本无法写入的原因,它可能是在世界权限5下运行的,它只提供读取和执行权限。
    猜你喜欢
    • 2015-04-29
    • 2012-08-16
    • 2013-01-09
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多