PHP mkdir:权限被拒绝问题

122

我想使用PHP的mkdir函数创建一个目录,但是出现了以下错误:Warning: mkdir() [function.mkdir]: Permission denied in ...。如何解决这个问题?


2
平台/网络服务器/操作系统? - Salman A
2
请查看这个问题:https://dev59.com/l2Yr5IYBdhLWcg3wKHEp 我曾经遇到同样的问题,那里的答案解决了我的问题。如果你在Linux上运行,那里关于SELinux的答案可能适用于你。 - Lucas Madureira
尝试一下,这对我有效。https://dev59.com/Qmox5IYBdhLWcg3wq2IC#12656964 - Akshay I
15个回答

214

你不需要将权限设置为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()函数应该可以正常工作,不会返回错误。


21
这是一个非常糟糕的想法。 - Big McLargeHuge
@simpleengine 你好,我注意到了你的回答。我正在使用CodeIgniter在Ubuntu 14.14 LTS上开发一个项目,遇到了同样的问题。你能否更详细地解释一下我需要采取哪些步骤来修复这个错误?为了给你一些额外的信息:绝对路径是/opt/lampp/htdocs/www/my-app/public/uploads。基本上,我想做的是让每个已登录的用户上传文件到uploads文件夹,并创建相册文件夹(这将使用php完成)以存储照片。 - ltdev
您可以查看我为获取额外信息所创建的主题:http://stackoverflow.com/questions/32861261/codeigniter-message-mkdir-permission-denied-on-ubuntu/32861524#32861524,http://forum.codeigniter.com/thread-63136.html,http://askubuntu.com/questions/679844/mkdir-permission-denied-to-create-folders-with-php。 - ltdev
31
我不喜欢那些只会说“这样不安全”而不指出安全方法的用户。 - Cedric Ipkiss
这个回答意味着OP将文件保存在/path/to/webserver/www路径(或其子文件夹)中。在我的情况下,我将文件保存在一个与/www文件夹不同的文件夹中(即我有public/project1/wwwpublic/project2/www,我正在保存到public/assets中)。这意味着我需要关注的文件夹的权限是public/assets而不是public/project1/www(或p2)。希望这能解决问题,避免麻烦。 - undefined
显示剩余8条评论

40
我遇到了同样的问题。
注意:我使用的是Mac OSX Lion操作系统。
问题出在Apache以用户"_www"的身份运行,没有权限编辑任何文件。你会发现通过php无法使用任何文件系统功能。
解决方法:
打开Finder窗口,从菜单栏选择前往 > 前往文件夹 > /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/*

8
这种解决方案虽然可行,但如果某人通过Shellshock漏洞执行恶意代码,则可能让Apache破坏您的系统。另一种选择是将Apache保持为“_www”用户并为您和Apache创建一个组。创建一个名为“trusted”的新组,并将您和“_www”添加到其中。然后将“trusted”设置为服务器文档目录中所有文件的组所有者。最后,只对Apache需要访问的文件进行必要的chmod g+rwx更改,这样“trusted”组就有权限编辑这些文件。 - Chris Middleton
4
强调一下,这个答案是一个坏主意。Apache进程拥有自己的特定用户有很多非常好的原因。 - danyamachine

17

在使用PHP的mkdir函数时不要将权限设置为777

在StackOverflow上,仅提供链接作为答案并不被视为良好实践,但是这里给出的建议通常不应该被遵循。

我想引用类似问题上的一个非常好的回答。我引用如下:

请停止建议使用777。这将使您的文件可以被任何人写入,这基本上意味着您失去了权限系统设计的所有安全性。如果您建议这样做,请考虑它可能对配置不良的Web服务器的影响:通过覆盖文件,攻击网站会变得非常容易。所以,不要这样做。


15
PHP报错“Permission denied”是因为mkdir()函数的路径错误。所以,要解决这个问题,你只需要获取正确的路径即可。我是这样做的:
<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';

if( !file_exists($dir) ) {
    mkdir($dir, 0755, true);
}

?>

1
当我转移到一个新的主机(有mysqlnd笑)时,发生了这种情况。我忘记更改为新的完整主目录路径。结果证明这实际上不是权限问题。 - JSG

10

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


我刚刚通过使用Filezilla递归地将文件权限更改为755,解决了原问题。右键单击父文件夹(假设它是某种通用文件存储库文件夹),然后选择文件属性->数字值-> 755,然后勾选“递归到子目录中”。如果您有很多文件,则需要几分钟才能在子目录中传播。然后再尝试一次。 - TARKUS

2

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

例如,在Ubuntu 10.04中,Apache(PHP)作为用户www-data在组www-data下运行。

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

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

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


15
“chmod 0777”将赋予所有人读写权限!你不应该提供这样的建议。然而,使用用户组的建议目前在这里是最好的 :) (备注:原文已经是英文了,我直接翻译成中文) - KingCrunch
1
如果世界可以访问操作系统,那当然可以。更好的方法是:sudo chown www-data:www-data my_parent_dir。 - Jon Skarpeteig
或者保持权限不变,将www-data添加到父目录的组中。 - Marc B

1
我刚刚遇到了这个问题,我现在能给你的最好解决方案是(尽管你没有包含任何代码):
  1. 请检查您的目标文件夹命名方式,例如:new_folder(有时这可能会导致权限错误,因为大多数主机不允许在运行时创建使用下划线、破折号等命名的文件夹)。这对我有效。
  2. 如果您正在使用递归命令创建子文件夹,请不要忘记将0755(记得在开头包含0)放入mkdir命令中,例如:

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('无法创建文件夹...');
        }
    
    }
    

这对我也刚刚起作用。


3
777是一个安全问题。 - MaicolBen
刚刚编辑过,到0755。 - arungisyadi

1
这个错误是由于路径不正确导致的。
例如:
我正在使用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);
}

它会为你工作!!享受吧!!


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

0
安装ftp服务器后,您需要进行配置。要启用写入访问权限,您需要编辑/etc/vsftpd.conf文件并取消注释。安装命令为sudo apt-get install vsftpd
#write_enable=YES

line, so it should read

write_enable=YES

保存文件并使用sudo service vsftpd restart重新启动vsftpd
有关其他配置选项,请参考此文档man vsftpd.conf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接