php中mkdir()函数的权限问题

在PHP中使用mkdir()创建目录时遇到权限问题,预期为0777,实得0755。分析表明,mkdir()创建目录的权限受制于Linux系统的umask,默认umask为0022导致目录权限被限制。chmod()函数则不受umask影响,可直接设置所需权限。为确保目录具有读写权限,建议避免直接用mkdir()指定权限,以免umask干扰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

使用以下php代码创建了一个目录,期望目录的权限是0777,实际结果是0755

mkdir('./aa/',0777);

分析与测试结果:

1.mkdir()函数指定的目录权限只能小于等于系统umask设定的默认权限。

如linux默认的umask一般0022, 即创建目录的默认权限是0755, 所以这时php  mkdir('./aa/',0777) 得到目录的权限是0755.

xw@xw-X201:~/Desktop/dd/aa$ umask
0022
xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw/',0777);"
xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw1/',0755);"
xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw2/',0747);"
xw@xw-X201:~/Desktop/dd/aa$ ll
总用量 20
drwxrwxrwx 5 xw xw 4096 2012-06-01 11:58 ./
drwxr-xr-x 6 xw xw 4096 2012-06-01 11:26 ../
drwxr-xr-x 2 xw xw 4096 2012-06-01 11:57 xw/
drwxr-xr-x 2 xw xw 4096 2012-06-01 11:58 xw1/
drwxr--r-x 2 xw xw 4096 2012-06-01 11:58 xw2/

把系统默认权限改为777,mkdir()可以指定更大权限了

xw@xw-X201:~/Desktop/dd/aa$ umask 000
xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw2/',0777);"
xw@xw-X201:~/Desktop/dd/aa$ ll
总用量 12
drwxrwxrwx 3 xw xw 4096 2012-06-01 12:08 ./
drwxr-xr-x 6 xw xw 4096 2012-06-01 11:26 ../
drwxrwxrwx 2 xw xw 4096 2012-06-01 12:08 xw2/


2.chmod()函数不受系统umask影响,可以设置比系统默认权限大的权限。

xw@xw-X201:~/Desktop/dd/aa$ umask
0022
xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw1/',0777);"
xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw2/');"
xw@xw-X201:~/Desktop/dd/aa$ php -r "mkdir('./xw3/');chmod('./xw3/',0777);"
xw@xw-X201:~/Desktop/dd/aa$ ll
总用量 20
drwxrwxrwx 5 xw xw 4096 2012-06-01 12:12 ./
drwxr-xr-x 6 xw xw 4096 2012-06-01 11:26 ../
drwxr-xr-x 2 xw xw 4096 2012-06-01 12:11 xw1/
drwxr-xr-x 2 xw xw 4096 2012-06-01 12:11 xw2/
drwxrwxrwx 2 xw xw 4096 2012-06-01 12:12 xw3/

3.系统的mkdir命令可以设置大于默认值的权限。

xw@xw-X201:~/Desktop/dd/aa$ umask
0022
xw@xw-X201:~/Desktop/dd/aa$ mkdir -m0777 xw
xw@xw-X201:~/Desktop/dd/aa$ ll
总用量 12
drwxrwxrwx 3 xw xw 4096 2012-06-01 12:18 ./
drwxr-xr-x 6 xw xw 4096 2012-06-01 11:26 ../
drwxrwxrwx 2 xw xw 4096 2012-06-01 12:18 xw/

总结:

php若要创建一个有读写权限的目录,最好使用以下代码,不要直接使用mkdir函数指定权限,以避免系统umask的影响

mkdir('./xw/');
chmod('./xw/',0777);



参考文章:

LINUX UMASK详解

 PHP用mkdir()新建立目录无写的权限的问题


### mkdir 函数参数说明与用法 `mkdir` 是一个用于创建目录的函数,常见于多种编程语言和系统调用中。以下是其参数、用法及示例的详细说明。 #### 参数说明 在 C 语言中,`mkdir` 的定义如下: ```c int mkdir(const char *pathname, mode_t mode); ``` - **pathname**:这是必填参数,表示要创建的目录路径。可以是相对路径或绝对路径[^1]。 - **mode**:这是一个权限掩码,指定新创建目录的权限模式。它通常由 `S_IRWXU`(用户读写执行)、`S_IRGRP`(组读)、`S_IXGRP`(组执行)等宏组合而成[^1]。 在 PHP 中,`mkdir` 的定义如下: ```php bool mkdir ( string $path [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] ) ``` - **path**:必填参数,表示要创建的目录路径,可以是相对路径或绝对路径[^4]。 - **mode**:可选参数,默认值为 `0777`,表示目录的权限。注意,实际权限可能会受到 umask 的影响。 - **recursive**:可选布尔值,如果设置为 `true`,则可以递归创建多级目录。 - **context**:可选参数,用于指定流上下文。 #### 示例代码 以下是一些不同语言中的 `mkdir` 使用示例: ##### C 语言示例 ```c #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> int main(void) { int ret; ret = mkdir("./new_dir", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); // 创建目录并设置权限 if (-1 == ret) { perror("mkdir error"); // 如果失败,输出错误信息 exit(-1); } exit(0); } ``` 此代码片段展示了如何使用 `mkdir` 创建名为 `new_dir` 的目录,并为其分配特定权限[^1]。 ##### PHP 示例 ```php <?php $path = '/var/www/html/new_folder'; // 目标目录路径 $mode = 0755; // 权限设置 $recursive = true; // 是否递归创建 if (!mkdir($path, $mode, $recursive)) { echo "创建目录失败"; } else { echo "目录创建成功"; } ?> ``` 这段代码演示了如何在 PHP 中使用 `mkdir` 创建一个多级目录,并设置了权限和递归选项[^4]。 #### 注意事项 - 在 C 语言中,`mode` 参数的实际效果可能受 umask 的影响,因此最终权限可能与指定的不同。 - 在 PHP 中,递归选项允许一次性创建多层目录结构,这在处理复杂路径时非常有用。 - 确保目标路径具有足够的权限以执行目录创建操作,否则可能会导致错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值