W3docs

fileowner()

Функция fileowner() в PHP возвращает числовой идентификатор пользователя, которому принадлежит файл. Узнайте синтаксис, значения возврата и примеры.

Функция fileowner() — это встроенная функция PHP, которая возвращает владельца файла в виде числового идентификатора пользователя (UID) — того же UID, который операционная система хранит в метаданных файла. Это PHP-эквивалент просмотра столбца владельца в ls -l. На этой странице объясняются синтаксис, возвращаемые значения, распространённая проблема устаревших кешированных результатов и способы преобразования числового UID в читаемое имя пользователя.

Синтаксис

fileowner(string $filename): int|false
  • $filename — путь к файлу (или каталогу) для проверки. Может быть относительным или абсолютным.
  • Возвращает идентификатор пользователя-владельца в виде int при успехе или false при ошибке (например, если файл не существует или у скрипта нет прав на чтение его метаданных).

Поскольку допустимый UID может быть равен 0 (пользователь root в Unix-системах), всегда сравнивайте результат с помощью строгого оператора === false, а не проверки на истинность — иначе вполне корректный файл, принадлежащий root, будет выглядеть как ошибка.

Базовый пример

<?php

$filename = __FILE__; // inspect the running script itself

$owner_id = fileowner($filename);

if ($owner_id === false) {
    echo "Failed to get the owner of the file.";
} else {
    echo "The owner of '$filename' has user ID $owner_id.";
}

Возможный вывод:

The owner of '/var/www/example.php' has user ID 33.

Точное число зависит от того, какая учётная запись ОС создала файл или является его владельцем (например, 33 — это стандартный пользователь www-data во многих системах Debian/Ubuntu).

Преобразование UID в имя пользователя

Голое число редко является тем, что нужно показывать пользователю. В Unix-подобных системах с включённым расширением POSIX передайте UID в posix_getpwuid() для получения данных учётной записи:

<?php

$uid = fileowner(__FILE__);

if ($uid !== false && function_exists('posix_getpwuid')) {
    $info = posix_getpwuid($uid);
    echo "Owner: {$info['name']} (UID {$uid})";
} else {
    echo "Owner UID: " . var_export($uid, true);
}

Это выводит что-то вроде Owner: www-data (UID 33). Расширение POSIX недоступно в Windows, поэтому оборачивайте вызов в function_exists(), как показано выше.

Остерегайтесь кешированных результатов

PHP кеширует результаты функций, основанных на stat (fileowner(), fileperms(), filegroup(), filesize() и других), для повышения производительности. Если владелец файла меняется в ходе одного и того же выполнения скрипта — например, после вызова chown() — функция fileowner() может вернуть старое значение. Сначала очистите кеш с помощью clearstatcache():

<?php

$file = 'report.txt';

chown($file, 'nobody');     // change ownership
clearstatcache();           // discard the stale stat cache
$uid = fileowner($file);    // now reflects the new owner

Примечания и особенности

  • Windows: концепция числового владельца POSIX не соответствует ACL Windows. fileowner() обычно возвращает 0, поэтому не полагайтесь на неё для логики прав доступа в Windows.
  • false vs. 0: 0 — это root (реальный владелец); false означает, что вызов завершился ошибкой. Используйте ===.
  • Нужно больше, чем просто владелец? stat() возвращает полный массив метаданных (размер, права, владелец, группа, временны́е метки) за один вызов, что дешевле, чем вызывать несколько функций file*() по отдельности.
  • Проверьте доступ сначала: если вам нужно лишь узнать, можно ли прочитать файл, правильный инструмент — is_readable(), так как fileowner() отвечает на другой вопрос.

Заключение

fileowner() — небольшая, но полезная функция для получения числового идентификатора владельца файла в PHP. Сравнивайте её результат с === false, помните, что 0 — допустимый владелец (root), вызывайте clearstatcache() после смены владельца и используйте posix_getpwuid(), когда нужно получить имя пользователя в читаемом виде. В Windows её результат не несёт смысловой нагрузки, поэтому оставляйте логику на основе владельца для Unix-подобных систем.

Практика

Практика
Какова цель функции fileowner() в PHP?
Какова цель функции fileowner() в PHP?
Was this page helpful?