【问题标题】:PHP mkdir: Permission denied problemPHP mkdir:权限被拒绝问题
【发布时间】:2011-07-11 21:26:29
【问题描述】:

我正在尝试使用 PHP mkdir 函数创建一个目录,但出现如下错误:Warning: mkdir() [function.mkdir]: Permission denied in ...。如何解决问题?

【问题讨论】:

标签: php


【解决方案1】:

修复你尝试创建目录的目录的权限in

【讨论】:

  • 我刚刚通过使用 Filezilla 将文件权限递归更改为 755 解决了原始问题中的问题。右键单击父文件夹,假设它是某种通用文件存储库文件夹,可以设置 755 权限,然后 File Attributes -> Numeric Value -> 755 ,然后选中“递归到子目录”。如果您有很多文件,则需要几分钟才能通过子目录传播。然后再试一次。
【解决方案2】:

您需要拥有文件系统权限才能创建目录。

示例:在 Ubuntu 10.04 中,apache (php) 以用户身份运行:www-data 在组中:www-data

意味着用户 www-data 需要访问权限才能创建目录。

您可以自己尝试使用:“su www-data”成为 www-data 用户。

作为快速修复,您可以执行以下操作:sudo chmod 777 my_parent_dir

【讨论】:

  • chmod 0777 将授予对世界的读写访问权限!你不应该建议这样的事情。但是,用户组的建议目前是最好的:)
  • 如果全世界都可以访问操作系统,那是肯定的。更好的方法是: sudo chown www-data:www-data my_parent_dir
  • 或者保留权限并将 www-data 添加到父目录的组。
【解决方案3】:

以后通过谷歌找到这个的人的迟到的答案。 我遇到了同样的问题。

注意:我使用的是 MAC OSX LION

发生的情况是 apache 以用户“_www”的身份运行,并且没有编辑任何文件的权限。你会注意到没有文件系统函数通过 php 工作。

如何解决:

打开一个查找器窗口并从菜单栏中选择 Go > Go To Folder > /private/etc/apache2

现在打开 httpd.conf

找到:

User _www 
Group _www

更改用户名:

User <YOUR LOGIN USERNAME>

现在通过运行这个表单终端重新启动 apache:

sudo apachectl -k restart

如果还是不行, 在执行上述操作之前,我碰巧做了以下操作。可能是相关的。

打开终端并运行以下命令: (请注意,我的网络服务器文件位于 /Library/WebServer/www。根据您的网站位置进行更改)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*

【讨论】:

  • 此解决方案有效,但如果有人让它执行恶意代码(例如通过 Shellshock 漏洞利用),它允许 Apache 对您的系统造成严重破坏。另一种方法是让 Apache 以_www 执行,并为您和 Apache 创建一个组。创建一个新组,称为trusted,然后将您自己和_www 放入其中。然后将信任的组所有者设置为服务器文档目录中所有文件的所有者。最后,根据需要仅对 Apache 需要访问的文件执行 chmod g+rwx,以便 trusted 组有权编辑文件。
  • 只是插话再次强调这个答案是个坏主意。有很多很好的理由让 apache 进程归他们自己的特殊用途用户所有。
【解决方案4】:

你可以做的另一件事是去:/etc/sudoers

添加以下行,该行授予该用户权限 www-数据全部=(全部:全部)全部 为什么是 www-data ?这是因为 apache 是通过这个用户名运行的。

如果您的用户不同,请尝试 用户名 ALL=(ALL:ALL) ALL

这对我有用。

【讨论】:

  • 不要直接编辑sudoers,而是以root身份登录,并使用te visudo命令:检查任何更改以避免错误编辑,这可能会导致sudoers文件解析错误已加载,这可能会让您无能为力(因为无权更改任何内容)
  • 如何找到用户名。像 www 数据?我正在使用 nginx 但无法正常工作
  • @robspin 试试这个:ps aux | egrep '(nginx)'
【解决方案5】:

我刚才遇到了这个问题,我现在可以给你的最好的解决方案(尽管你没有包含任何代码)是:

  1. 检查您如何命名目标文件夹,例如:new_folder(有时这会导致权限错误,因为大多数主机不允许在运行时创建使用下划线、破折号等的名称)。它对我有用。
  2. 如果您使用递归命令创建子文件夹,请不要忘记将 0755(记得在开头包含 0)放入 mkdir 命令,例如:

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }
    

这对我也有效。

【讨论】:

  • 777 是一个安全问题
  • 刚刚编辑,到 0755
【解决方案6】:

我知道这是一个旧线程,但它需要一个更好的答案。您不需要将权限设置为 777,这是一个安全问题,因为它提供了对世界的读写访问权限。可能是您的 apache 用户对该目录没有读/写权限。

这是你在 Ubuntu 中所做的事情

  1. 确保所有文件都归 Apache 组和用户所有。在 Ubuntu 中,它是 www-data 组和用户

    sudo chown -R www-data:www-data /path/to/webserver/www

  2. 接下来启用 www-data 组的所有成员读写文件

    sudo chmod -R g+rw /path/to/webserver/www

php mkdir() 函数现在应该可以正常工作而不会返回错误

【讨论】:

  • Apache 确实需要权限才能写入缓存和日志等内容……这只是微调的问题。
  • @simpleengine 嗨,我注意到了你的回答。我在尝试在 CodeIgnter 中创建并在 Ubuntu 14.14 Lts 中开发的项目中遇到了同样的问题。你能否解释一下我更深思熟虑我需要做的步骤来解决这个错误???给你一些额外的信息:绝对路径是/opt/lampp/htdocs/www/my-app/public/uploads ..基本上我要做的是每个登录用户在上传文件夹中上传文件并创建专辑文件夹(这将用php完成)存储照片..
  • 我不喜欢那些一直说“它不安全”而不展示安全方式的用户。
【解决方案7】:

由于您使用的是 mac,您可以将自己添加到 mac 上的 _www(apache 用户组)组:

sudo dseditgroup -o edit -a $USER -t user _www

并将 _www 用户添加到 wheel 组中,这似乎是 mac 创建文件的方式:

sudo dseditgroup -o edit -a _www -t user wheel

【讨论】:

    【解决方案8】:

    我知道这个帖子很旧,但也许有一天这会对某人有所帮助。

    为什么 PHP 对 mkdir() 说“权限被拒绝”的问题 - 错误的 url 路径。因此,要修复它,您只需要获得正确的路径即可。我是这样做的:

    <?php
    
    $root = $_SERVER["DOCUMENT_ROOT"];
    $dir = $root . '/somefolder/';
    
    if( !file_exists($dir) ) {
        mkdir($dir, 0755, true);
    }
    
    ?>
    

    【讨论】:

    • 转移到新主机(具有 mysqlnd 大声笑)时发生在我身上。我忘记更改为新的完整主目录路径。事实证明这实际上不是权限问题。
    【解决方案9】:

    在 PHP 中使用 mkdir 时不要将权限设置为 777

    仅链接的答案在 StackOverflow 上不被视为良好做法,但通常不应遵循此处给出的建议。

    我想恢复到this great answer on a similar question。我引用:

    请停止建议使用 777。您正在让每个人都可以写入您的文件,这几乎意味着您失去了权限系统设计的所有安全性。如果您建议这样做,请考虑一下它可能对配置不当的网络服务器产生的后果:通过覆盖文件来“破解”网站将变得非常容易。所以,不要。

    【讨论】:

      【解决方案10】:

      如果您使用的是 LINUX,首先让我们检查一下 apache 的用户,因为在某些发行版中可能会有所不同:

      egrep -i '^user|^group' /etc/httpd/conf/httpd.conf 
      

      假设结果是“http”。执行以下操作,只需记住将 path_to_folder 更改为文件夹路径即可:

      chown -R http:http path_to_folder
      chmod -R g+rw path_to_folder
      

      【讨论】:

        【解决方案11】:

        检查是否不是umask的问题

        if (!function_exists('mkdir_r')) {
            /**
             * create directory recursively
             * @param $dirName
             * @param int $rights
             * @param string $dir_separator
             * @return bool
             */
            function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
                $dirs = explode($dir_separator, $dirName);
                $dir = '';
                $created = false;
                foreach ($dirs as $part) {
                    $dir .= $part . $dir_separator;
                    if (!is_dir($dir) && strlen($dir) > 0) {
                        $created = mkdir($dir, $rights);
                    }
                }
                return $created;
            }
        }
        
        if (!function_exists('ensure_dir')) {
            /**
             * ensure directory exist if not create 
             * @param $dir_path
             * @param int $mode
             * @param bool $use_mask
             * @param int $mask
             * @return bool
             */
            function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
                // set mask 
                $old_mask = $use_mask && $mask != null
                    ? umask($mask)
                    : null;
                try {
                    return is_dir($dir_path) || mkdir_r($dir_path, $mode);
                } finally {
                    if ($use_mask && $old_mask != null) {
                        // restore original
                        umask($old_mask);
                    }
                }
            }
        }
        

        【讨论】:

          【解决方案12】:

          使用sudo apt-get install vsftpd 安装 ftp 服务器后,您必须对其进行配置。要启用写访问,您必须编辑 /etc/vsftpd.conf 文件并取消注释

          #write_enable=YES
          

          行,所以它应该是

          write_enable=YES
          

          保存文件并用sudo service vsftpd restart重新启动vsftpd

          有关其他配置选项,请咨询this documentationman vsftpd.conf

          【讨论】:

            【解决方案13】:

            如果您使用了错误的路径,则会出现此错误。

            例如:

            我使用的是ubuntu系统,我的项目文件夹名称是'myproject'

            假设我有 myproject/public/report 目录并且想要创建一个名为 orders

            的新文件夹

            然后我需要我的项目所在的完整路径。可以通过 PWD 命令获取路径

            所以我的根路径将是 = '/home/htdocs/myproject/'

            $dir = '/home/htdocs/myproject/public/report/Orders';

            if (!is_dir($dir)) {
               mkdir($dir, 0775, true);
            }
            

            它会为你工作!享受!!

            【讨论】:

              【解决方案14】:

              我已尽我所能解决此问题,但上述答案均无济于事。 最后重启 apache 就成功了

              sudo service apache2 restart

              我的系统运行 Ubuntu 20,Samba 共享存在权限问题的目录。

              【讨论】:

                猜你喜欢
                • 2018-03-19
                • 1970-01-01
                • 2012-03-22
                • 1970-01-01
                • 2016-08-24
                • 2013-07-01
                • 2012-08-13
                相关资源
                最近更新 更多