PHP:mkdir():权限被拒绝

PHP:mkdir():权限被拒绝

我有 php 脚本,应该在“albums”和“pl”中创建两个新文件夹。apache 可以在“albums”中创建新文件夹,但不能在“pl”中创建新文件夹,即使它们具有相同的权限。我不明白我做错了什么。

ls -Z /music
drwxrwxrwx. apache root system_u:object_r:unlabeled_t:s0 albums
drwxrwxrwx. apache root system_u:object_r:unlabeled_t:s0 pl

php

function createdir($dir) {
        if (!is_dir($dir)) {
            mkdir($dir);
                if (is_dir($dir)) {
                        echo "PASS<br />";
                }else{
                        echo "FAILED<br />";
                }

        }else{
                echo "The dir is there";
        }

}

createdir("/music/pl/07012013/");
createdir("/music/albums/06012013333333331111/");

苏阿帕奇

su - apache -s /bin/bash
-bash-4.1$ mkdir /music/pl/06012013
mkdir: cannot create directory `/music/pl/06012013': Permission denied

答案1

查看php 的 mkdir

您需要将递归设置为 true,因此请尝试类似mkdir($dir,0700,true)

答案2

由于这似乎是一个常见问题,有很多答案并不能涵盖我遇到的所有问题;我将添加我对这个问题的经验和确实有效的解决方案。

我注意到您没有设置递归标志,您没有使用权限标志,并且您似乎没有使用服务器的绝对路径。

按照绝对路径,它与确保 apache 用户 www-data 确实有权修改直接父文件夹中的所有内容有关。

您是否尝试过使用权限标志的命令或尝试过当前的 umask 和八进制表示(根据 PHP.net)?目前,有关 mkdir 的 PHP 文档表明,如果未指定权限参数,Linux 系统将默认为“777”,这是最不严格的(出于安全原因不建议这样做),并且文档还说权限可能应该以八进制指定,因此应该在权限前添加一个零。您可能还想检查当前 umask 的引用,因为如果当前掩码非零,则掩码值将从实际权限集中减去,如果当前 umask 为 022 并且您指定 777,则您获得的权限为 755。

就我而言,PHP.net 的建议并没有解决问题,当我研究这个问题是如何表现出来的时,结果发现 www-data 用户缺少访问、修改或读取创建的文件夹和文件所需的一些权限。我尝试将权限标志设置为“6640”,它确实起作用了;而且它导致所有子目录和文件继承“640”权限(考虑 640 并将您的帐户添加到 www-data 组)。

简而言之,有两个选项可以尝试,一个来自 PHP 文档,对我来说不起作用,但可能对某些人有用:

$old = umask(0);
mkdir("/path/some_dir/", 0755, true);
umask ($old);

但对我来说,有一个有点奇怪的行为:

$old = umask(0000);
mkdir(“/var/www/html/somewebsite/images/somefolder/somefolder/", 6640, true);
umask ($old);

请注意,我实际上并没有在脚本中授予执行权限。我注意到其他网站上有许多其他类似的问题,他们发现一些 PHP.net 信息对他们的情况很有用,但我已将最终对我的情况有用的答案包含在内。我希望这些信息至少能帮助一些人。

相关内容