[英]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.