繁体   English   中英

"PHP mkdir:权限被拒绝问题"

[英]PHP mkdir: Permission denied problem

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

"

我知道这是一个旧线程,但它需要一个更好的答案。 您不需要将权限设置为 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()函数现在应该可以正常工作而不会返回错误

对于将来通过谷歌找到这个的人的迟到答案。 我遇到了同样的问题。

注意:我使用的是 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/*

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

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

我想在一个类似的问题上回复到这个很好的答案 我引用:

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

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

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

<?php

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

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

?>

修复您尝试.

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

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

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

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

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

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

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

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

这也适用于我刚才。

您可以做的另一件事是转到:/etc/sudoers

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

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

这对我有用。

由于您使用的是 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

如果您使用的是 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

检查它是否不是 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);
            }
        }
    }
}

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

#write_enable=YES

行,所以它应该读

write_enable=YES

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

对于其他配置选项,请参阅此文档man vsftpd.conf

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

例如:

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

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

我尽我所能来解决这个问题,但上述答案都没有帮助。 最后重新启动 apache 就成功了

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM