ZetCode

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值(对于文件)。

最佳实践

来源

PHP umask文档

本教程介绍了PHP的umask函数,并通过实际示例展示了其在文件系统操作中用于权限控制的用法。

作者

我的名字是Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从2007年开始撰写编程文章,至今已撰写了1400多篇文章和8本电子书。我在教学编程方面有十多年的经验。

列出 所有 PHP 文件系统函数