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. falsevs.0:0— этоroot(реальный владелец);falseозначает, что вызов завершился ошибкой. Используйте===.- Нужно больше, чем просто владелец?
stat()возвращает полный массив метаданных (размер, права, владелец, группа, временны́е метки) за один вызов, что дешевле, чем вызывать несколько функцийfile*()по отдельности. - Проверьте доступ сначала: если вам нужно лишь узнать, можно ли прочитать файл, правильный инструмент —
is_readable(), так какfileowner()отвечает на другой вопрос.
Заключение
fileowner() — небольшая, но полезная функция для получения числового идентификатора владельца файла в PHP. Сравнивайте её результат с === false, помните, что 0 — допустимый владелец (root), вызывайте clearstatcache() после смены владельца и используйте posix_getpwuid(), когда нужно получить имя пользователя в читаемом виде. В Windows её результат не несёт смысловой нагрузки, поэтому оставляйте логику на основе владельца для Unix-подобных систем.