chown()
Die Funktion chown() in PHP ändert den Eigentümer einer Datei oder eines Verzeichnisses – wichtig für Server-Administratoren und Entwickler.
Die PHP-Funktion chown()
Die Funktion chown() ändert den Eigentümer einer Datei oder eines Verzeichnisses. Auf Unix-ähnlichen Systemen hat jede Datei einen besitzenden Benutzer und eine besitzende Gruppe; chown() aktualisiert den Benutzer. Sie wird hauptsächlich von Server-Administratoren und Deployment-Skripten verwendet, die eine Datei einem bestimmten Systemkonto zuweisen müssen – zum Beispiel um eine hochgeladene Datei dem Webserver-Benutzer zu übergeben, damit sie ausgeliefert oder verwaltet werden kann.
Diese Seite beschreibt die Syntax, Parameter, den Rückgabewert, die erforderlichen Berechtigungen, häufige Fallstricke und ausführbare Beispiele.
Der Eigentümer ist der Benutzer, nicht die Gruppe. Um die besitzende Gruppe zu ändern, verwende
chgrp(). Um Lese-/Schreib-/Ausführungsrechte zu ändern, verwendechmod(). Diese drei Funktionen werden häufig verwechselt.
Syntax
chown(string $filename, string|int $user): bool$filename— Pfad zur Datei oder zum Verzeichnis, dessen Eigentümer geändert werden soll.$user— der neue Eigentümer, angegeben entweder als Benutzername-string (z. B."www-data") oder als numerische Benutzer-ID (UID, z. B.33).
Die Funktion gibt bei Erfolg true und bei Fehler false zurück.
Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
$filename | string | Der Pfad zur Zieldatei oder zum Zielverzeichnis. |
$user | string | int | Der neue Eigentümer. Ein string wird als Benutzername behandelt; eine Ganzzahl als UID. |
Bei Angabe eines Benutzernamen als string muss PHP diesen in eine UID auflösen, daher muss der Benutzer in der Benutzerdatenbank des Systems vorhanden sein. Die direkte Angabe der UID überspringt diesen Schritt.
Rückgabewert
chown() gibt einen boolean zurück:
true— der Eigentümer wurde erfolgreich geändert.false— die Änderung ist fehlgeschlagen (Datei nicht gefunden, unzureichende Rechte oder der angegebene Benutzer existiert nicht). Es wird außerdem eine Warnung ausgegeben.
Überprüfe stets den Rückgabewert, anstatt Erfolg anzunehmen:
<?php
if (chown("example.txt", "www-data")) {
echo "Owner changed successfully.";
} else {
echo "Could not change owner.";
}Wer darf chown() aufrufen?
Dies ist der häufigste Grund, warum chown() „nicht funktioniert":
- Auf Unix kann nur der Superuser (root) den Eigentümer einer Datei ändern. Ein normaler, nicht-root-Prozess kann eine Datei nicht an einen anderen Benutzer übertragen.
- Daher gibt
chown()in einem typischen Shared-Hosting- oder Standard-PHP-FPM-Setupfalsezurück, es sei denn, der PHP-Prozess läuft als root – was normalerweise vermieden werden sollte. chown()ist unter Windows nicht verfügbar im traditionellen Sinne und verhält sich dort als No-op.
Wenn du nur den Zugriff steuern und nicht den Eigentümer wechseln musst, bevorzuge
chmod(), das der Eigentümer einer Datei ohne root-Rechte aufrufen kann.
Beispiele
Beispiel 1: Eigentümer per Benutzername setzen
Setze den Eigentümer von example.txt auf den Benutzer www-data:
<?php
$file = "example.txt";
if (chown($file, "www-data")) {
echo "Owner of {$file} set to www-data.";
} else {
echo "Failed to change owner of {$file}.";
}Beispiel 2: Eigentümer per UID setzen
Wenn du die numerische Benutzer-ID kennst, kannst du sie direkt übergeben. Hier ist 1000 eine typische UID für
den ersten Nicht-Systembenutzer:
<?php
chown("example.txt", 1000);Beispiel 3: Eigentümer mit fileowner() auslesen
Nach dem Ändern des Eigentümers kannst du das Ergebnis bestätigen. fileowner()
gibt die UID zurück, und (auf Systemen mit der POSIX-Erweiterung) wandelt posix_getpwuid()
diese UID in einen Namen um:
<?php
$file = "example.txt";
chown($file, "www-data");
clearstatcache(); // owner info is cached — clear it before re-reading
$uid = fileowner($file); // e.g. 33
$info = posix_getpwuid($uid); // ["name" => "www-data", ...]
echo "Owner UID: {$uid}\n";
echo "Owner name: {$info['name']}\n";clearstatcache() ist hier wichtig: PHP speichert Dateistatusinformationen im Cache; ohne diesen Aufruf könntest du den alten Eigentümer lesen. Weitere Details findest du unter clearstatcache().
Beispiel 4: Eigentümer eines Verzeichnisses ändern
chown() funktioniert auch auf Verzeichnissen, ist aber nicht rekursiv – es betrifft nur den
Verzeichniseintrag selbst, nicht die darin enthaltenen Dateien. Um den Eigentümer eines ganzen Verzeichnisbaums zu ändern,
muss über den Inhalt iteriert werden:
<?php
$dir = "/var/www/uploads";
chown($dir, "www-data"); // the directory only
foreach (new DirectoryIterator($dir) as $item) {
if (!$item->isDot()) {
chown($item->getPathname(), "www-data");
}
}Häufige Fallstricke
- Gibt
falsefür Nicht-root-Prozesse zurück. Dies ist beabsichtigt – nur root kann Eigentümerschaft neu zuweisen. - Gecachte Eigentümerdaten. Rufe
clearstatcache()auf, bevor du nach einer Änderung erneut Eigentümerinformationen liest. - Symbolischen Links wird gefolgt.
chown()ändert das Ziel des Links. Um einen Symlink selbst zu ändern, verwendelchown(). - Nicht rekursiv. Verzeichnisse erfordern eine manuelle Iteration (Beispiel 4).
open_basedir/disable_functions. Viele Hoster deaktivierenchown()aus Sicherheitsgründen; überprüfephp.ini, wenn die Funktion still fehlschlägt.
Verwandte Funktionen
chgrp()— ändert die besitzende Gruppe einer Datei.chmod()— ändert Berechtigungen (Lesen/Schreiben/Ausführen) einer Datei.fileowner()— gibt die UID des Eigentümers einer Datei zurück.filegroup()— gibt die GID der Gruppe einer Datei zurück.lchown()— ändert den Eigentümer eines symbolischen Links selbst.clearstatcache()— leert PHPs gecachte Dateistatusdaten.
Fazit
Die Funktion chown() ändert den Eigentümer einer Datei oder eines Verzeichnisses und akzeptiert entweder einen Benutzernamen-string oder eine numerische UID; sie gibt einen boolean zurück. Das Wichtigste ist: Das Ändern des Eigentümers erfordert Superuser-Rechte, weshalb sie im alltäglichen Webcode so häufig false zurückgibt. Wenn du nur den Zugriff steuern musst, greife stattdessen auf chmod() zurück; um die Gruppe zu ändern, verwende chgrp().