W3docs

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, verwende chmod(). 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

ParameterTypBeschreibung
$filenamestringDer Pfad zur Zieldatei oder zum Zielverzeichnis.
$userstring | intDer 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-Setup false zurü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 false fü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, verwende lchown().
  • Nicht rekursiv. Verzeichnisse erfordern eine manuelle Iteration (Beispiel 4).
  • open_basedir / disable_functions. Viele Hoster deaktivieren chown() aus Sicherheitsgründen; überprüfe php.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().

Übungen

Übung
Was ist der Zweck der Funktion 'chown' in PHP?
Was ist der Zweck der Funktion 'chown' in PHP?
Was this page helpful?