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 для директорий) и проверяйте возвращаемое значение, поскольку функция завершается тихо, если скрипт не является владельцем цели.