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

Использование fileperms для проверки прав доступа
Раздел: Работа с файловой системой
fileperms(string $filename): int|false
Описание функции fileperms

Функция fileperms() в PHP возвращает информацию о правах доступа к файлу или директории. Она применяется для получения числового значения, представляющего разрешения в виде восьмеричного числа.

Аргументы функции

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

  • filename (string) - Путь к проверяемому файлу или директории.

Возвращаемое значение - целое число, представляющее битовую маску прав доступа. При неудаче возвращается false.

Простые примеры использования
Базовый пример
$perms = fileperms('example.txt');
echo $perms;
33206
Преобразование в восьмеричный формат
echo substr(sprintf('%o', fileperms('example.txt')), -4);
0644
Проверка прав директории
$dirPerms = decoct(fileperms('uploads') & 0777);
echo $dirPerms;
0755
Похожие функции в PHP
  • stat() - Возвращает подробную информацию о файле, включая права доступа в элементе 'mode'. Используется при необходимости получения комплексных данных.
  • is_readable() - Проверяет доступность файла для чтения. Применяется для быстрой проверки конкретного права.
  • is_writable() - Определяет возможность записи в файл. Удобна для проверки перед операциями записи.
  • is_executable() - Проверяет, является ли файл исполняемым. Используется для проверки скриптов или программ.
  • clearstatcache() - Очищает кеш состояния файлов. Требуется после многократных вызовов fileperms() для одного файла.
Типичные ошибки
Отсутствие проверки на false
$perms = fileperms('несуществующий_файл.txt');
echo substr(sprintf('%o', $perms), -4);
Warning и некорректный вывод
Неправильное преобразование чисел
echo dechex(fileperms('file.txt')); // Ошибочный формат
81a4
Игнорирование кеширования
$perms1 = fileperms('file.txt');
chmod('file.txt', 0777);
$perms2 = fileperms('file.txt'); // Может вернуть старое значение
echo $perms1 == $perms2 ? 'Одинаково' : 'Разные';
Одинаково (без clearstatcache())
Изменения в версиях PHP
  • PHP 7.0.0 - Добавлена поддержка контекстных потоков.
  • PHP 5.0.0 - Функция начала возвращать false при ошибке (ранее возвращала 0).
  • Ранние версии - Функция всегда возвращала целое число, даже при ошибках.
Расширенные примеры
Определение типа файла
Пример php
function getFileType($filename) {
    $perms = fileperms($filename);
    if (($perms & 0xC000) === 0xC000) return 'Сокет';
    if (($perms & 0xA000) === 0xA000) return 'Ссылка';
    if (($perms & 0x8000) === 0x8000) return 'Файл';
    if (($perms & 0x6000) === 0x6000) return 'Блочное устройство';
    if (($perms & 0x4000) === 0x4000) return 'Директория';
    if (($perms & 0x2000) === 0x2000) return 'Символьное устройство';
    if (($perms & 0x1000) === 0x1000) return 'FIFO';
    return 'Неизвестно';
}
echo getFileType('/tmp');
Директория
Рекурсивная проверка прав
Пример php
function checkDirectoryPermissions($dir, $expected = 0755) {
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    foreach ($iterator as $file) {
        if ($file->isFile()) {
            if ((fileperms($file) & 0777) != $expected) {
                echo 'Несоответствие: ' . $file->getPathname() . PHP_EOL;
            }
        }
    }
}
checkDirectoryPermissions('project/');
Визуальное представление прав
Пример php
function formatPermissions($perms) {
    $symbolic = '';
    $symbolic .= (($perms & 0x0100) ? 'r' : '-');
    $symbolic .= (($perms & 0x0080) ? 'w' : '-');
    $symbolic .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x') : (($perms & 0x0800) ? 'S' : '-'));
    $symbolic .= (($perms & 0x0020) ? 'r' : '-');
    $symbolic .= (($perms & 0x0010) ? 'w' : '-');
    $symbolic .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x') : (($perms & 0x0400) ? 'S' : '-'));
    $symbolic .= (($perms & 0x0004) ? 'r' : '-');
    $symbolic .= (($perms & 0x0002) ? 'w' : '-');
    $symbolic .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x') : (($perms & 0x0200) ? 'T' : '-'));
    return $symbolic;
}
echo formatPermissions(fileperms('script.sh'));
rwxr-xr-x
Аналоги в других языках

Fileperms в Python

import os
perms = oct(os.stat('example.txt').st_mode)[-4:]
print(perms)
'0644'
JavaScript (Node.js)
const fs = require('fs');
fs.stat('example.txt', (err, stats) => {
  console.log('0' + (stats.mode & 0o777).toString(8));
});
0644
Bash/Shell
stat -c '%a' example.txt
644

PHP fileperms function comments

En
Fileperms Gets file permissions