[英]PHP mkdir: Permission denied problem
我正在嘗試使用 PHP mkdir 函數創建一個目錄,但出現如下錯誤:
Warning: mkdir() [function.mkdir]: Permission denied in ...<\/code> 。
如何解決問題?
"
我知道這是一個舊線程,但它需要一個更好的答案。 您不需要將權限設置為 777,這是一個安全問題,因為它提供了對世界的讀寫訪問權限。 可能是您的 apache 用戶對該目錄沒有讀/寫權限。
這是你在 Ubuntu 中所做的
確保所有文件都歸 Apache 組和用戶所有。 在 Ubuntu 中,它是www-data組和用戶
sudo chown -R www-data:www-data /path/to/webserver/www
接下來啟用 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() 說“權限被拒絕”的問題 - 錯誤的 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
我剛才有這個問題,我現在可以給你的最好的解決方案(盡管你沒有包含任何代碼)是:
如果您使用遞歸命令創建子文件夾,請不要忘記將 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.