簡體   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