fileowner()
Die Funktion fileowner() gibt den Eigentümer einer Datei als numerische Benutzer-ID (UID) zurück – eine eingebaute PHP-Funktion.
Die Funktion fileowner() ist eine eingebaute PHP-Funktion, die den Eigentümer einer Datei als numerische Benutzer-ID (UID) zurückgibt – dieselbe UID, die das Betriebssystem in den Metadaten der Datei speichert. Sie ist das PHP-Äquivalent zum Anzeigen der Eigentümer-Spalte in ls -l. Diese Seite erläutert die Syntax, die Rückgabewerte, die häufige Falle veralteter Cache-Ergebnisse und wie die numerische UID in einen lesbaren Benutzernamen umgewandelt werden kann.
Syntax
fileowner(string $filename): int|false$filename— der Pfad zur Datei (oder zum Verzeichnis), die untersucht werden soll. Er kann relativ oder absolut angegeben werden.- Gibt die Benutzer-ID des Eigentümers als
intbei Erfolg zurück, oderfalsebei einem Fehler (zum Beispiel wenn die Datei nicht existiert oder das Skript keine Berechtigung hat, ihre Metadaten zu lesen).
Da eine gültige UID 0 sein kann (der root-Benutzer auf Unix-Systemen), sollte das Ergebnis immer mit dem strikten Operator === false verglichen werden, anstatt eine lockere Wahrheitsprüfung zu verwenden – andernfalls würde eine korrekte Datei im Besitz von root wie ein Fehler aussehen.
Einfaches Beispiel
<?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.";
}Eine mögliche Ausgabe lautet:
The owner of '/var/www/example.php' has user ID 33.Die genaue Zahl hängt davon ab, welches Betriebssystem-Konto die Datei erstellt hat oder besitzt (zum Beispiel ist 33 der Standard-Benutzer www-data auf vielen Debian/Ubuntu-Systemen).
Die UID in einen Benutzernamen umwandeln
Eine bloße Zahl ist selten das, was man einem Benutzer anzeigen möchte. Auf Unix-ähnlichen Systemen mit aktivierter POSIX-Erweiterung kann die UID an posix_getpwuid() übergeben werden, um die Kontodetails nachzuschlagen:
<?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);
}Dies gibt etwas wie Owner: www-data (UID 33) aus. Die POSIX-Erweiterung ist unter Windows nicht verfügbar, daher sollte der Aufruf wie gezeigt mit function_exists() abgesichert werden.
Achtung bei gecachten Ergebnissen
PHP speichert die Ergebnisse stat-basierter Funktionen (fileowner(), fileperms(), filegroup(), filesize() und ähnliche) aus Leistungsgründen im Cache. Wenn sich der Eigentümer der Datei während desselben Skriptlaufs ändert – zum Beispiel nach einem Aufruf von chown() – kann fileowner() den alten Wert zurückgeben. Leeren Sie den Cache zuerst mit clearstatcache():
<?php
$file = 'report.txt';
chown($file, 'nobody'); // change ownership
clearstatcache(); // discard the stale stat cache
$uid = fileowner($file); // now reflects the new ownerHinweise und Besonderheiten
- Windows: Das Konzept eines numerischen POSIX-Eigentümers lässt sich nicht sauber auf Windows-ACLs abbilden.
fileowner()gibt typischerweise0zurück, daher sollte es für Berechtigungslogik unter Windows nicht verwendet werden. falsevs.0:0istroot(ein echter Eigentümer);falsebedeutet, dass der Aufruf fehlgeschlagen ist. Verwenden Sie===.- Mehr als nur den Eigentümer benötigt?
stat()gibt das vollständige Metadaten-Array (Größe, Modus, Eigentümer, Gruppe, Zeitstempel) in einem einzigen Aufruf zurück, was günstiger ist als mehrerefile*()-Funktionen separat aufzurufen. - Zugriff zuerst prüfen: Wenn Sie nur wissen müssen, ob Sie eine Datei lesen können, ist
is_readable()das richtige Werkzeug –fileowner()beantwortet eine andere Frage.
Fazit
fileowner() ist eine kleine, aber nützliche Funktion zum Lesen des numerischen Eigentümers einer Datei in PHP. Vergleichen Sie das Ergebnis mit === false, denken Sie daran, dass 0 ein gültiger Eigentümer (root) ist, rufen Sie clearstatcache() nach einer Eigentümeränderung auf, und verwenden Sie posix_getpwuid(), wenn Sie den lesbaren Benutzernamen benötigen. Unter Windows ist das Ergebnis nicht aussagekräftig, daher sollte eigentümerbasierte Logik auf Unix-ähnliche Systeme beschränkt bleiben.