PHP mkdir:权限被拒绝的问题

时间:2011-03-09 12:57:38

标签: php

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

13 个答案:

答案 0 :(得分:144)

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

这是你在Ubuntu中做的事情

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

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

  2. 接下来,www-data组的所有成员都可以读取和写入文件

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

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

答案 1 :(得分:36)

将来通过谷歌发现此问题的人的迟到答案。 我遇到了同样的问题。

注意:我在MAC OSX狮子会上

如果用户“_www”正在运行apache并且没有编辑任何文件的权限,那么会发生什么。您会注意到没有文件系统功能可以通过php工作。

如何解决:

打开一个取景器窗口,然后从菜单栏中选择Go>转到文件夹> /私有的/ 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/*

答案 2 :(得分:14)

在PHP中使用mkdir

时,不要设置777的权限

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

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

  

请停止建议使用777.您必须让所有人都可以写入您的文件,这几乎意味着您将失去该权限系统所设计的所有安全性。如果您建议这样做,请考虑它可能对配置不当的网络服务器产生的后果:它会变得非常容易“#ha;&#34;该网站,通过覆盖文件。所以,不要。

答案 3 :(得分:9)

修复您尝试在中创建目录的目录的权限。

答案 4 :(得分:5)

我知道这个帖子已经过时了,但也许有一天这会对某人有所帮助。

PHP为mkdir()说“Permission denied”的问题 - 错误的url路径。所以,要解决这个问题,你只需要获得正确的路径即可。我是这样做的:

<?php

$root = filter_input(INPUT_SERVER, 'DOCUMENT_ROOT');
$dir = $root . '/somefolder/';
$old = umask(0);

if( !is_dir($dir) ) {
    mkdir($dir, 0755, true);
}
umask($old);

?>

答案 5 :(得分:2)

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

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

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

您可以使用以下命令自行尝试:'su www-data'成为www-data用户。

作为快速解决方案,你可以这样做:sudo chmod 777 my_parent_dir

答案 6 :(得分:1)

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

添加以下行,为该用户授予权限 www-data ALL =(ALL:ALL)ALL 为何选择www-data?这是因为apache正在以此用户名运行。

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

这对我有用。

答案 7 :(得分:0)

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

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

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }
    
  3. 这对我来说也很有用。

答案 8 :(得分:0)

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

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

并将_www用户添加到轮组,这似乎是mac创建文件的对象:

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

答案 9 :(得分:0)

如果你使用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

答案 10 :(得分:0)

检查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);
            }
        }
    }
}

答案 11 :(得分:0)

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

#write_enable=YES

行,因此它应该显示

write_enable=YES

保存文件,然后用vsftpd重新启动sudo service vsftpd restart

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

答案 12 :(得分:0)

如果使用错误的路径,则会发生此错误。

例如:

我正在使用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);
}

它将为您服务!享受!!