Chmod: примеры (PHP)

Полное руководство по работе с chmod в PHP
Раздел: Работа с файловой системой
chmod(string $filename, int $permissions): bool

Функция chmod изменяет права доступа к указанному файлу или директории в операционных системах Unix/Linux и их аналогах. Она используется для управления разрешениями на чтение, запись и выполнение для владельца, группы и всех остальных пользователей.

Основные аргументы функции

Функция имеет два обязательных параметра:

  1. filename (string) - путь к файлу или директории
  2. permissions (int) - числовое представление прав доступа (восьмеричное число)

Возвращает true при успешном выполнении и false при ошибке.

Формат прав доступа

Права задаются восьмеричным числом, состоящим из трех или четырех цифр:

  • Первая цифра (опционально) - специальные флаги (setuid, setgid, sticky bit)
  • Вторая цифра - права владельца (owner)
  • Третья цифра - права группы (group)
  • Четвертая цифра - права для остальных (others)
Базовые значения прав
  • 4 - чтение (read)
  • 2 - запись (write)
  • 1 - выполнение (execute)
Базовые примеры использования
Установка стандартных прав
// Права 644: владелец - чтение/запись, группа - чтение, остальные - чтение
$result = chmod('/path/to/file.txt', 0644);
echo $result ? 'Успешно' : 'Ошибка';
Успешно
Установка прав с полным доступом для владельца
// Права 755: владелец - все, группа - чтение/выполнение, остальные - чтение/выполнение
chmod('/path/to/script.php', 0755);
true
Использование строкового представления
// Конвертация строки в восьмеричное число
$permissions = intval('755', 8);
$result = chmod('/path/to/file.php', $permissions);
var_dump($result);
bool(true)
Работа с директориями
// Установка прав для директории
chmod('/path/to/directory', 0755);

// Рекурсивное изменение прав через итератор
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/path/to/dir'),
    RecursiveIteratorIterator::SELF_FIRST
);

foreach ($iterator as $item) {
    if ($item->isFile()) {
        chmod($item->getPathname(), 0644);
    } else {
        chmod($item->getPathname(), 0755);
    }
}
Похожие функции в PHP

Устанавливает маску прав по умолчанию для вновь создаваемых файлов и директорий. Работает глобально для текущего процесса.

// Установка маски 022
$old = umask(022);

// Создание файла с учетом маски
fopen('newfile.txt', 'w');

// Восстановление предыдущей маски
umask($old);

Возвращает информацию о правах доступа к файлу в виде целого числа.

$perms = fileperms('/path/to/file.txt');
echo decoct($perms & 0777);
644
is_readable/is_writable/is_executable

Проверяют конкретные права доступа для текущего пользователя PHP.

$file = '/path/to/file.txt';

if (is_readable($file)) {
    echo 'Файл доступен для чтения';
}

if (is_writable($file)) {
    echo 'Файл доступен для записи';
}
Аналоги в других языках программирования

Chmod в Python

Использует функцию os.chmod() с аналогичной логикой, но поддерживает symbolic notation.

import os
import stat

# Числовой формат
os.chmod('/path/to/file.txt', 0o644)

# Символьный формат
os.chmod('/path/to/file.txt', stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)
JavaScript (Node.js)

Функция fs.chmod() с асинхронным и синхронным вариантами.

const fs = require('fs');

// Асинхронный вызов
fs.chmod('/path/to/file.txt', 0o755, (err) => {
    if (err) throw err;
    console.log('Права изменены');
});

// Синхронный вызов
fs.chmodSync('/path/to/file.txt', 0o644);
Bash/Shell

Команда chmod с поддержкой символьной и числовой записи.

# Числовая запись
chmod 755 script.sh

# Символьная запись
chmod u+rwx,g+rx,o+rx script.sh

Chmod в MySQL

СУБД MySQL не имеет прямой аналогии, но имеет систему привилегий для объектов базы данных.

GRANT SELECT, INSERT ON database.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
Типичные ошибки и проблемы
Игнорирование ведущего нуля
// Неправильно - десятичное число 755 вместо восьмеричного 0755
chmod('/path/to/file.txt', 755);
Права установятся как 755 в десятичной системе, что соответствует 1363 в восьмеричной
Попытка изменения прав системного файла
// Требуются права суперпользователя
$result = chmod('/etc/passwd', 0666);
var_dump($result);
bool(false)
Файл не существует
$result = chmod('/nonexistent/file.txt', 0644);
if ($result === false) {
    echo 'Файл не найден или нет прав доступа';
}
Файл не найден или нет прав доступа
Использование на Windows
// На Windows функция имеет ограниченную функциональность
chmod('C:\\file.txt', 0644);
// Изменяются только атрибуты "только для чтения" и "скрытый"
Изменения в последних версиях PHP

В PHP 8.0 не было внесено значительных изменений в работу функции chmod. Основное поведение осталось стабильным на протяжении многих версий.

PHP 7.0 и выше
  • Улучшена обработка ошибок
  • Более строгая типизация параметров
  • Поддержка 64-битных систем для больших значений прав
Совместимость

Функция сохраняет обратную совместимость со всеми версиями PHP, начиная с PHP 4. Основной синтаксис и поведение не изменялись.

Расширенные примеры использования
Безопасное изменение прав
Пример php
function safeChmod(string $file, int $permissions): bool {
    if (!file_exists($file)) {
        trigger_error("Файл не существует: $file", E_USER_WARNING);
        return false;
    }
    
    // Проверка текущих прав
    $current = fileperms($file) & 0777;
    
    // Изменяем только если необходимо
    if ($current !== $permissions) {
        return chmod($file, $permissions);
    }
    
    return true;
}

// Использование
safeChmod('/path/to/file.txt', 0644);
Массовое изменение прав с фильтрацией
Пример php
$directory = '/path/to/project';
$filePattern = '*.php';

foreach (glob($directory . '/**/' . $filePattern, GLOB_BRACE) as $file) {
    // Только для PHP файлов
    if (pathinfo($file, PATHINFO_EXTENSION) === 'php') {
        // Пропускаем симлинки
        if (!is_link($file)) {
            chmod($file, 0644);
            echo "Изменены права для: $file\n";
        }
    }
}
Использование symbolic notation
Пример php
function chmodSymbolic(string $file, string $symbolic): bool {
    $permissions = 0;
    
    // Парсинг символьной записи (упрощенный вариант)
    if (strpos($symbolic, 'u+r') !== false) $permissions |= 0400;
    if (strpos($symbolic, 'u+w') !== false) $permissions |= 0200;
    if (strpos($symbolic, 'u+x') !== false) $permissions |= 0100;
    
    if (strpos($symbolic, 'g+r') !== false) $permissions |= 0040;
    if (strpos($symbolic, 'g+w') !== false) $permissions |= 0020;
    if (strpos($symbolic, 'g+x') !== false) $permissions |= 0010;
    
    if (strpos($symbolic, 'o+r') !== false) $permissions |= 0004;
    if (strpos($symbolic, 'o+w') !== false) $permissions |= 0002;
    if (strpos($symbolic, 'o+x') !== false) $permissions |= 0001;
    
    return chmod($file, $permissions);
}

// Использование
chmodSymbolic('/path/to/script.sh', 'u+rwx,g+rx,o+rx');
Восстановление исходных прав
Пример php
class PermissionBackup {
    private array $backup = [];
    
    public function backup(string $file): void {
        if (file_exists($file)) {
            $this->backup[$file] = fileperms($file) & 0777;
        }
    }
    
    public function restore(string $file): bool {
        if (isset($this->backup[$file])) {
            return chmod($file, $this->backup[$file]);
        }
        return false;
    }
}

// Использование
$backup = new PermissionBackup();
$backup->backup('/path/to/file.txt');
chmod('/path/to/file.txt', 0777);
// ... операции с файлом
$backup->restore('/path/to/file.txt');
Работа со специальными флагами
Пример php
// Установка setuid бита (4000)
chmod('/path/to/executable', 04755);

// Установка setgid бита (2000) для директории
chmod('/path/to/shared_dir', 02775);

// Sticky bit (1000) для временных директорий
chmod('/tmp/shared_tmp', 01777);

// Комбинация специальных флагов
chmod('/path/to/special', 06755); // setuid + setgid
Интеграция с системными вызовами
Пример php
// Использование shell_exec как альтернатива
function chmodViaShell(string $file, int $permissions): string {
    $octal = decoct($permissions);
    return shell_exec("chmod $octal " . escapeshellarg($file));
}

// Использование
chmodViaShell('/path/to/file.txt', 0755);

// Проверка через stat
function getPermissionsVerbose(string $file): string {
    $perms = fileperms($file);
    $info = '';
    $info .= (($perms & 0x0100) ? 'r' : '-');
    $info .= (($perms & 0x0080) ? 'w' : '-');
    $info .= (($perms & 0x0040) ? 'x' : '-');
    $info .= (($perms & 0x0020) ? 'r' : '-');
    $info .= (($perms & 0x0010) ? 'w' : '-');
    $info .= (($perms & 0x0008) ? 'x' : '-');
    $info .= (($perms & 0x0004) ? 'r' : '-');
    $info .= (($perms & 0x0002) ? 'w' : '-');
    $info .= (($perms & 0x0001) ? 'x' : '-');
    return $info;
}

echo getPermissionsVerbose('/path/to/file.txt');
rw-r--r--

PHP chmod function comments

En
Chmod Changes file mode