W3docs

chmod()

chmod() — функция PHP для изменения прав доступа к файлу. Синтаксис, восьмеричные значения, примеры и типичные ошибки.

Функция PHP chmod()

chmod() изменяет режим доступа (биты прав) файла или директории в файловых системах Unix-подобных ОС. Режим определяет, кто и что может делать с файлом: читать его содержимое, записывать или выполнять. Корректная настройка прав важна для безопасности — слишком мягкие права позволят любому прочитать или перезаписать конфиденциальные данные; слишком строгие — лишат веб-сервер доступа к нужным файлам.

На этой странице рассматриваются синтаксис, чтение и запись восьмеричного режима, наиболее употребительные значения прав, возвращаемое значение и типичные ловушки (ведущий ноль, umask и Windows).

Синтаксис

chmod(string $filename, int $permissions): bool
ПараметрОписание
$filenameПуть к файлу или директории, права которых нужно изменить.
$permissionsНовый режим в виде восьмеричного целого числа (например, 0644).

Функция возвращает true при успехе и false при ошибке.

Как работает восьмеричный режим

Режим — это трёхзначное восьмеричное число. Каждая цифра описывает одну категорию пользователей:

Позиция цифрыПрименяется к
1-я (например, 644)Владелец файла
2-я (например, 644)Группа
3-я (например, 644)Остальные (все прочие)

Каждая цифра — это сумма предоставляемых прав:

ЗначениеПраво
4Чтение
2Запись
1Выполнение
0Нет прав

Складываем: чтение + запись = 4 + 2 = 6, чтение + выполнение = 4 + 1 = 5. Таким образом, 0750 означает: владелец: чтение/запись/выполнение (7), группа: чтение/выполнение (5), остальные: нет прав (0).

Внимание

В PHP режим обязательно указывается с ведущим 0, чтобы он воспринимался как восьмеричный. chmod("file.txt", 644) передаёт десятичное число 644, которое соответствует восьмеричному 1204 — почти наверняка не то, что нужно. Всегда пишите 0644.

Распространённые значения прав

РежимВладелецГруппаОстальныеТипичное применение
0644чтение/записьчтениечтениеОбычные файлы (HTML, изображения, конфиг, читаемый сервером)
0600чтение/записьПриватные файлы (учётные данные, ключи)
0755чтение/запись/выполнениечтение/выполнениечтение/выполнениеДиректории и исполняемые скрипты
0700чтение/запись/выполнениеПриватные директории
0777всёвсёвсёРедко оправдано — любой может читать и перезаписывать

Примеры

Установка прав для одного файла

Режим 0644 даёт владельцу право чтения и записи, тогда как группа и все остальные могут только читать:

<?php
if (chmod("example.txt", 0644)) {
    echo "Permissions updated.";
} else {
    echo "Failed to change permissions.";
}

Сделать скрипт исполняемым

Для прямого запуска PHP-скрипта (например, cron-задачи в CLI) владельцу требуется право выполнения:

<?php
chmod("backup.php", 0744); // owner: rwx, group & others: read only

Всегда проверяйте возвращаемое значение

chmod() завершается тихо, возвращая false — например, если скрипт не является владельцем файла. Не полагайтесь на то, что операция прошла успешно:

<?php
$file = "config.ini";
if (!chmod($file, 0600)) {
    error_log("Could not secure {$file}");
}

Типичные ошибки

  • Важен владелец. Процесс может вызвать chmod() только для файла, которым он владеет (или от имени суперпользователя). На общем хостинге пользователь веб-сервера зачастую не является владельцем файла, поэтому вызов возвращает false.
  • umask не влияет на chmod(). В отличие от mkdir() и создания файлов, chmod() устанавливает ровно тот режим, который вы указали. umask маскирует только вновь создаваемые файлы — см. umask().
  • Windows игнорирует большинство битов. NTFS не имеет Unix-модели прав, поэтому в Windows значимо изменяется только бит «только для чтения».
  • Проверяйте перед изменением. Используйте is_writable() для проверки доступа и fileperms() для чтения текущего режима перед его перезаписью.

Связанные функции

  • fileperms() — получить текущие биты прав файла.
  • is_writable() — проверить, может ли скрипт выполнять запись по указанному пути.
  • umask() — установить маску по умолчанию для вновь создаваемых файлов.
  • mkdir() — создать директорию с заданным режимом доступа.

Заключение

chmod() — ваш инструмент для настройки прав доступа к файлам и директориям из PHP. Запомните три правила, позволяющих избежать большинства ошибок: указывайте режим в восьмеричном виде с ведущим нулём, выбирайте минимально необходимые права (0644 для файлов, 0755 для директорий) и проверяйте возвращаемое значение, поскольку функция завершается тихо, если скрипт не является владельцем цели.

Практика

Практика
Что делает функция chmod в PHP?
Что делает функция chmod в PHP?
Was this page helpful?