PHP umask 函数
最后修改于 2025 年 4 月 3 日
PHP的umask函数用于设置文件和目录的默认权限掩码。它会影响新创建文件和目录的权限。
基本定义
umask函数用于更改当前的umask(用户掩码)值。它接受一个八进制值,表示默认情况下要禁用的权限。
语法:umask(?int $mask = null): int。该函数返回之前的umask值。如果不带参数调用,它会在不更改当前umask的情况下返回当前umask值。
基本umask示例
本示例展示了如何设置基本umask及其对文件创建的影响。
basic_umask.php
<?php
declare(strict_types=1);
$old_mask = umask(0);
echo "Old umask: " . decoct($old_mask) . "\n";
$file = fopen("test.txt", "w");
fclose($file);
$perms = fileperms("test.txt");
echo "File permissions: " . decoct($perms & 0777) . "\n";
umask($old_mask); // Restore original umask
unlink("test.txt");
这会将umask设置为0,允许完全权限(777)。创建的文件将根据umask设置权限。之后我们会恢复原始umask。
限制性umask示例
本示例演示了限制性umask如何影响新文件的权限。
restrictive_umask.php
<?php
declare(strict_types=1);
$old_mask = umask(0077); // Remove all group/other permissions
echo "Old umask: " . decoct($old_mask) . "\n";
$file = fopen("secure.txt", "w");
fclose($file);
$perms = fileperms("secure.txt");
echo "File permissions: " . decoct($perms & 0777) . "\n";
umask($old_mask); // Restore original umask
unlink("secure.txt");
使用umask 0077,新文件将具有600(rw-------)的权限。umask值会从默认权限(文件的666)中减去。
使用umask创建目录
本示例展示了umask如何以不同方式影响目录权限。
directory_umask.php
<?php
declare(strict_types=1);
$old_mask = umask(0022); // Common default umask
echo "Old umask: " . decoct($old_mask) . "\n";
mkdir("new_directory");
$perms = fileperms("new_directory");
echo "Directory permissions: " . decoct($perms & 0777) . "\n";
umask($old_mask); // Restore original umask
rmdir("new_directory");
使用umask 0022,新目录将具有755(rwxr-xr-x)的权限。umask会从默认目录权限(777)中减去。执行位仍然保留。
临时umask更改
本示例展示了如何为特定操作临时更改umask。
temporary_umask.php
<?php
declare(strict_types=1);
function createSecureFile(string $filename): void {
$old_mask = umask(0077);
$file = fopen($filename, "w");
fclose($file);
umask($old_mask);
}
createSecureFile("private.txt");
$perms = fileperms("private.txt");
echo "File permissions: " . decoct($perms & 0777) . "\n";
unlink("private.txt");
该函数临时设置了一个限制性的umask用于文件创建。umask在文件创建后会自动恢复,避免了全局的副作用。
检查当前umask
本示例演示了如何在不更改的情况下检查当前umask。
check_umask.php
<?php
declare(strict_types=1);
$current_umask = umask();
echo "Current umask: " . decoct($current_umask) . "\n";
// Create a test file to see actual permissions
$file = fopen("testfile.txt", "w");
fclose($file);
$perms = fileperms("testfile.txt");
echo "Actual file permissions: " . decoct($perms & 0777) . "\n";
unlink("testfile.txt");
不带参数调用umask()会返回当前umask值。实际的文件权限将是666减去umask值(对于文件)。
最佳实践
- 恢复umask:在更改后请始终恢复原始umask。
- 八进制表示法:为清晰起见,请使用八进制数(例如,077)。
- 作用域:将umask更改限制在最小必要的作用域内。
- 安全性:考虑权限的安全影响。
- 文档记录:在团队环境中记录umask的更改。
来源
本教程介绍了PHP的umask函数,并通过实际示例展示了其在文件系统操作中用于权限控制的用法。
作者
列出 所有 PHP 文件系统函数。