umask()
Функция umask() в PHP устанавливает права доступа по умолчанию для новых файлов и директорий. Узнайте синтаксис, параметры и примеры использования.
Введение
В PHP функция umask() устанавливает права доступа по умолчанию для вновь создаваемых файлов и директорий. Это удобный инструмент для управления доступом к файлам в ваших скриптах. В этой статье мы рассмотрим всё, что нужно знать о umask(): синтаксис, параметры и практические примеры.
Понимание функции umask()
umask (маска режима создания файлов пользователем) — это набор битов прав доступа, которые операционная система убирает из прав по умолчанию каждый раз, когда процесс создаёт файл или директорию. Функция umask() считывает или изменяет эту маску для текущего PHP-процесса.
- Принимает необязательный параметр
$mask. Если вызвать её без аргументов, она вернёт текущую маску, не меняя ничего. - Если маска передана, она становится новой маской, а функция возвращает предыдущее значение маски.
- Маска применяется ко всему PHP-процессу, а не только к текущему скрипту — поэтому её изменение может повлиять на последующие операции с файлами в рамках того же запроса.
PHP отталкивается от базовых прав системы — как правило, 0666 для файлов (чтение + запись, без выполнения) и 0777 для директорий — и вычисляет итоговые права через побитовое AND с инвертированной маской:
final = base & ~maskКак работает математика маски
Маска обнуляет содержащиеся в ней биты. Каждая восьмеричная цифра соответствует владельцу, группе и остальным; каждая цифра — это сумма чтения (4), записи (2) и выполнения (1).
При umask(022):
files: 0666 & ~022 = 0666 & 0755 = 0644 (rw-r--r--)
directories: 0777 & ~022 = 0777 & 0755 = 0755 (rwxr-xr-x)Цифра 2 на позициях группы и остальных убирает бит записи, поэтому группа и остальные могут читать, но не писать. Более строгая маска umask(077) обнулит все права группы и остальных, оставив 0600 для файлов и 0700 для директорий — файлы, доступные только владельцу.
Синтаксис функции umask()
Синтаксис функции umask() выглядит следующим образом:
umask($mask);Здесь $mask — новая маска. Она должна быть указана в восьмеричной нотации, поэтому всегда пишите её с ведущим нулём (например, 022). Запись 22 будет интерпретирована как десятичное значение 22, а не как восьмеричная маска.
Примеры использования umask()
Пример 1: Установка прав по умолчанию для новых файлов
<?php
umask(022);
$file_handle = fopen('example.txt', 'w');
fclose($file_handle);
echo 'File permissions: ' . decoct(fileperms('example.txt') & 0777);
unlink('example.txt');Вывод:
File permissions: 644Здесь маска устанавливается в 022, затем создаётся example.txt. Базовые права файла 0666 минус заблокированные маской биты записи дают 0644. Функция fileperms() считывает фактические права, а & 0777 убирает биты типа файла, чтобы decoct() вывел только часть с правами доступа.
Пример 2: Чтение и восстановление текущей маски
Поскольку маска влияет на весь процесс, корректно написанная функция должна восстанавливать её по завершении. Вызов umask() без аргумента возвращает текущее значение, не изменяя его.
<?php
// Save the current mask, then apply a strict one
$old = umask(077);
$dir = sys_get_temp_dir() . '/private';
mkdir($dir);
echo 'Dir permissions: ' . decoct(fileperms($dir) & 0777) . "\n";
// Restore the original mask
umask($old);
echo 'Restored mask: ' . decoct(umask()) . "\n";
rmdir($dir);Вывод:
Dir permissions: 700
Restored mask: 22Здесь umask(077) обнуляет все биты группы и остальных, поэтому новая директория получает права 0777 & ~077 = 0700 — доступные только владельцу. Сохранение предыдущей маски в $old и передача её обратно в umask() оставляет процесс в том же состоянии, в котором он находился в начале.
Распространённые ошибки
umask()действует в масштабе всего процесса. В долго работающих контекстах (FPM-воркеры, CLI-демоны) вызовumask()в одном скрипте влияет на последующие запросы того же воркера. Всегда восстанавливайте предыдущее значение, как в примере 2.- Маска влияет только на создание. Существующие файлы не изменяются; используйте
chmod()для изменения прав постфактум. - ОС ограничивает результат.
umask()может только убирать биты. Она не может добавить бит выполнения обычному файлу, поскольку базовый режим для файлов уже равен0666. - Забытый ведущий ноль.
umask(22)иumask(022)означают разное — первое десятичное, второе восьмеричное.
Связанные функции
chmod()— изменение прав доступа существующего файла или директории.fileperms()— чтение текущих битов прав доступа файла.mkdir()— создание директории (аргумент mode также фильтруется через umask).fopen()— открытие или создание файла.
Заключение
Функция umask() контролирует, какие биты прав доступа убираются из вновь создаваемых файлов и директорий. Помните, что она работает путём убирания битов (base & ~mask), действует в масштабе всего процесса и влияет только на новые объекты. Если вы изменяете её внутри функции, сохраняйте и восстанавливайте предыдущее значение, чтобы не нарушить работу последующего кода.