W3docs

lchown()

PHP lchown() ändert den Eigentümer eines symbolischen Links, ohne dem Ziel zu folgen. Syntax, Rückgabewert, Unterschiede zu chown() und Rechtevorgaben.

Die PHP-Funktion lchown() ändert den Eigentümer eines symbolischen Links selbst, ohne dem Link zu seinem Ziel zu folgen. Diese Seite erläutert, was die Funktion tut, wie sie sich von chown() unterscheidet, die genaue Signatur und den Rückgabewert, wann man sie tatsächlich benötigt, sowie die Berechtigungsregeln, die über Erfolg oder Misserfolg entscheiden.

Was ist die Funktion lchown()?

lchown() ist eine eingebaute PHP-Funktion, die den Benutzer (Eigentümer) eines symbolischen Links setzt. Das Präfix „l" bedeutet, dass die Funktion auf den Link selbst wirkt und nicht auf die Datei, auf die der Link verweist – dieselbe Konvention wie bei den zugrunde liegenden C-Bibliotheksaufrufen (lchown vs. chown).

Dieser Unterschied ist nur bei symbolischen Links relevant. Ein Symlink ist eine kleine Datei, die einen Pfad zu einer anderen Datei speichert. Die meisten Dateisystemaufrufe dereferenzieren einen Symlink automatisch: Wenn man chown() auf einen Symlink aufruft, ändert man den Eigentümer der Zieldatei. lchown() ist die Variante, die beim Link stoppt und stattdessen die Eigentümerschaft des Links selbst ändert.

lchown() ist das Gegenstück zur Benutzer-Eigentümerschaft von lchgrp(), das die Gruppe eines Symlinks ändert.

Syntax

lchown(string $filename, string|int $user): bool
ParameterBeschreibung
$filenamePfad zum symbolischen Link, dessen Eigentümer geändert werden soll.
$userDer neue Eigentümer – entweder ein Benutzername (string) wie 'www-data' oder eine numerische Benutzer-ID (int) wie 33.

Rückgabewert. lchown() gibt true bei Erfolg und false bei Fehler zurück (und gibt eine Warnung aus, zum Beispiel wenn die Berechtigung fehlt oder der Pfad nicht existiert).

Einfaches Beispiel

<?php

$link = '/path/to/link';
$user = 'myuser';

if (lchown($link, $user)) {
    echo 'Ownership of symbolic link updated successfully';
} else {
    echo 'Failed to update ownership of symbolic link';
}

Hier wird der Eigentümer des symbolischen Links /path/to/link auf myuser gesetzt. Die if-Abfrage prüft das boolean-Ergebnis, damit man auf einen Fehler reagieren kann, anstatt ihn stillschweigend zu ignorieren.

lchown() vs. chown(): Warum der Unterschied wichtig ist

Der Unterschied zeigt sich am deutlichsten, wenn ein Link und sein Ziel unterschiedliche Eigentümer haben. Angenommen, report.txt ist eine echte Datei und latest ist ein Symlink darauf:

<?php

$target = '/var/data/report.txt';
$link   = '/var/data/latest';      // symlink -> report.txt

// Changes the OWNER OF report.txt (chown follows the link):
chown($link, 'alice');

// Changes the OWNER OF the symlink "latest" only; report.txt is untouched:
lchown($link, 'bob');

Verwende lchown(), wenn du gezielt die Metadaten des Links ändern möchtest, ohne die Zieldatei zu berühren oder versehentlich neu zu besitzen. chown() hier zu verwenden, wäre ein Fehler, wenn die Absicht war, den Link selbst zu übernehmen.

Vollständige Demonstration

Dieses Skript erstellt eine echte Datei und einen Symlink darauf, ändert dann den Eigentümer des Links auf den aktuellen Benutzer und bestätigt das Ergebnis. Da das Ändern der Eigentümerschaft normalerweise erhöhte Rechte erfordert, ist die Rückübertragung auf den aktuellen Benutzer der einzige Fall, den ein normaler Benutzer durchführen darf.

<?php

$target = sys_get_temp_dir() . '/lchown_target.txt';
$link   = sys_get_temp_dir() . '/lchown_link';

file_put_contents($target, "hello\n");
@unlink($link);            // remove any leftover link from a previous run
symlink($target, $link);   // create the symbolic link

$me = posix_getpwuid(posix_geteuid())['name']; // current process user

if (lchown($link, $me)) {
    echo "Link owner set to: " . posix_getpwuid(lstat($link)['uid'])['name'] . "\n";
} else {
    echo "lchown() failed\n";
}

lstat() (statt stat()) wird verwendet, um die eigenen Metadaten des Links zu lesen – entsprechend der Art, wie lchown() diese schreibt.

Berechtigungen und Besonderheiten

  • Berechtigung erforderlich. Das Ändern des Eigentümers eines Elements auf einen anderen Benutzer erfordert in der Regel root-Rechte. Als normaler Benutzer kann man den Eigentümer üblicherweise nur auf sich selbst „ändern", was effektiv keine Wirkung hat. Andernfalls ist false zusammen mit einer Warnung zu erwarten.
  • Windows. lchown() ist eine POSIX-Operation und steht unter Windows nicht zur Verfügung. Sie ist für Unix-ähnliche Dateisysteme gedacht.
  • Der Pfad muss ein Symlink sein. lchown() auf eine reguläre Datei zu richten funktioniert zwar auf Betriebssystemebene, aber der eigentliche Zweck der Funktion sind Symlinks – für gewöhnliche Dateien sollte chown() verwendet werden.
  • Unterdrücken, nicht ignorieren. Fehler lösen eine E_WARNING aus. Es ist besser, den Rückgabewert zu prüfen (wie oben gezeigt), als die Warnung mit @ zu unterdrücken und auf das Beste zu hoffen.

Verwandte Funktionen

  • chown() — Eigentümer einer Datei ändern (folgt Symlinks).
  • lchgrp() — Gruppe eines symbolischen Links ändern.
  • chgrp() — Gruppe einer Datei ändern.
  • fileowner() — Benutzer-ID des Eigentümers einer Datei auslesen.
  • symlink() — Einen symbolischen Link erstellen.
  • readlink() — Das Ziel zurückgeben, auf das ein Symlink verweist.

Fazit

lchown() ändert den Eigentümer eines symbolischen Links selbst und nicht der Datei, auf die er verweist – das ist der entscheidende Grund, diese Funktion statt chown() zu verwenden. Es sind ausreichende Berechtigungen erforderlich, die Funktion ist nur unter Unix verfügbar und gibt einen boolean zurück, der immer geprüft werden sollte.

Übung

Übung
Was ist der Zweck der Funktion lchown() in PHP?
Was ist der Zweck der Funktion lchown() in PHP?
Was this page helpful?