我正在尝试使用PHP mkdir函数创建一个目录,但是我收到如下错误:Warning: mkdir() [function.mkdir]: Permission denied in ...
。如何解决问题?
答案 0 :(得分:144)
我知道这是一个老线程,但需要更好的答案。您不需要将权限设置为777,这是一个安全问题,因为它提供对世界的读写访问权限。可能是您的apache用户对目录没有读/写权限。
这是你在Ubuntu中做的事情
确保所有文件归Apache组和用户所有。在Ubuntu中,它是 www-data 组和用户
chown -R www-data:www-data /path/to/webserver/www
接下来,www-data组的所有成员都可以读取和写入文件
chmod -R g+rw /path/to/webserver/www
php mkdir()
函数现在应该可以正常工作而不会返回错误
答案 1 :(得分:36)
将来通过谷歌发现此问题的人的迟到答案。 我遇到了同样的问题。
注意:我在MAC OSX狮子会上
如果用户“_www”正在运行apache并且没有编辑任何文件的权限,那么会发生什么。您会注意到没有文件系统功能可以通过php工作。
如何解决:
打开一个取景器窗口,然后从菜单栏中选择Go>转到文件夹> /私有的/ 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/*
答案 2 :(得分:14)
仅限链接答案在StackOverflow上不被视为良好做法,但通常不应遵循此处给出的建议。
我想恢复this great answer on a similar question。我引用:
请停止建议使用777.您必须让所有人都可以写入您的文件,这几乎意味着您将失去该权限系统所设计的所有安全性。如果您建议这样做,请考虑它可能对配置不当的网络服务器产生的后果:它会变得非常容易“#ha;&#34;该网站,通过覆盖文件。所以,不要。
答案 3 :(得分:9)
修复您尝试在中创建目录的目录的权限。
答案 4 :(得分:5)
我知道这个帖子已经过时了,但也许有一天这会对某人有所帮助。
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);
?>
答案 5 :(得分:2)
您需要具有文件系统权限才能创建目录。
示例:在Ubuntu 10.04中,apache(php)以用户身份运行:www-data in group:www-data
意味着用户www-data需要访问才能创建目录。
您可以使用以下命令自行尝试:'su www-data'成为www-data用户。
作为快速解决方案,你可以这样做:sudo chmod 777 my_parent_dir
答案 6 :(得分:1)
你可以做的另一件事是:/ etc / sudoers
添加以下行,为该用户授予权限 www-data ALL =(ALL:ALL)ALL 为何选择www-data?这是因为apache正在以此用户名运行。
如果您的用户不同,请尝试 username ALL =(ALL:ALL)ALL
这对我有用。
答案 7 :(得分:0)
我刚才遇到这个问题,我现在可以给你的最佳解决方案(尽管你没有包含任何代码)会是:
如果您使用递归命令创建子文件夹,请不要忘记将0755(记得在开头包含0)添加到mkdir命令,例如:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}
这对我来说也很有用。
答案 8 :(得分:0)
由于您使用的是Mac,因此您可以将自己添加到Mac上的_www(apache用户组)组中:
sudo dseditgroup -o edit -a $USER -t user _www
并将_www用户添加到轮组,这似乎是mac创建文件的对象:
sudo dseditgroup -o edit -a _www -t user wheel
答案 9 :(得分:0)
如果你使用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
答案 10 :(得分: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);
}
}
}
}
答案 11 :(得分:0)
使用sudo apt-get install vsftpd
安装ftp服务器后,必须对其进行配置。要启用写访问权限,您必须编辑/etc/vsftpd.conf
文件并取消注释
#write_enable=YES
行,因此它应该显示
write_enable=YES
保存文件,然后用vsftpd
重新启动sudo service vsftpd restart
。
有关其他配置选项,请咨询this documentation或man vsftpd.conf
答案 12 :(得分:0)
如果使用错误的路径,则会发生此错误。
例如:
我正在使用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);
}
它将为您服务!享受!!