PHP mkdir:权限被拒绝的问题

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

folos asked 2019-09-11T04:22:23Z
12个解决方案
142 votes

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

这是你在Ubuntu中所做的

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

    mkdir()

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

    mkdir()

php mkdir()函数现在可以正常运行而不会返回错误

simpleengine answered 2019-09-11T04:23:24Z
36 votes

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

注意:我在MAC OSX狮子会上

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

怎么修:

打开一个finder窗口,从菜单栏中选择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/*
Chris Ingis answered 2019-09-11T04:25:15Z
14 votes

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

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

我想在类似的问题上回复这个伟大的答案。 我引用:

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

Wilt answered 2019-09-11T04:26:05Z
9 votes

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

Erik answered 2019-09-11T04:26:32Z
4 votes

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

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

?>
Boris answered 2019-09-11T04:27:08Z
2 votes

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

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

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

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

作为快速修复,你可以这样做:sudo chmod 777 my_parent_dir

Jon Skarpeteig answered 2019-09-11T04:28:00Z
1 votes

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

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

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

这对我有用。

maxwells answered 2019-09-11T04:28:42Z
0 votes

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

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

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

sudo dseditgroup -o edit -a _www -t user wheel
SeanJA answered 2019-09-11T04:29:15Z
0 votes

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

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

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

这对我来说也很有用。

arungisyadi answered 2019-09-11T04:30:15Z
0 votes

如果你使用LINUX,首先让我们检查apache的用户,因为在某些发行版中它可能是不同的:

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

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

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
Marcelo Agimóvel answered 2019-09-11T04:30:50Z
0 votes

检查它是否与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);
            }
        }
    }
}
ceph3us answered 2019-09-11T04:31:20Z
0 votes

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

#write_enable=YES

行,所以它应该阅读

write_enable=YES

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

有关其他配置选项,请参阅此文档或man vsftpd.conf

mySun answered 2019-09-11T04:32:08Z
translate from https://stackoverflow.com:/questions/5246114/php-mkdir-permission-denied-problem