Start · Sprachen · PHP · Referenz · chown

chown

Funktion

Ändert den Eigentümer (Besitzer) einer Datei auf dem Dateisystem.

seit PHP 4.0.0 Kategorie: io

Signatur

chown(string $filename, string|int $user): bool

Beschreibung

chown() setzt den Eigentümer einer Datei oder eines Verzeichnisses auf den angegebenen Benutzer. Der Parameter user kann dabei entweder als Benutzername (String) oder als numerische User-ID (UID) übergeben werden.

Diese Funktion steht ausschließlich auf Unix-ähnlichen Betriebssystemen (Linux, macOS) zur Verfügung und ist unter Windows nicht verfügbar. Außerdem muss der PHP-Prozess mit ausreichenden Berechtigungen (root oder der aktuelle Eigentümer) laufen, um den Eigentümer einer Datei ändern zu können.

Typische Einsatzgebiete sind Server-seitige Deployment-Skripte, Installationsroutinen oder administrative Tools, die nach dem Erstellen von Dateien den Eigentümer korrekt setzen müssen – etwa wenn ein Skript als root läuft, die Datei aber einem normalen Benutzer gehören soll.

Hinweis: Symbolische Links werden von chown() aufgelöst – die Funktion ändert den Eigentümer der Zieldatei, nicht des Links selbst. Für Links steht lchown() zur Verfügung.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur Datei oder zum Verzeichnis, deren Eigentümer geändert werden soll.
$user Pflicht string|int Der neue Eigentümer als Benutzername (z. B. 'www-data') oder als numerische UID (z. B. 33).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Eigentümer erfolgreich geändert wurde, andernfalls false. Im Fehlerfall wird zusätzlich eine Warnung (E_WARNING) ausgegeben.

Beispiele

Eigentümer einer Datei per Benutzername setzen

<?php
$datei = '/var/www/html/upload/bericht.pdf';
$neuerEigentuemer = 'www-data';

if (chown($datei, $neuerEigentuemer)) {
    echo "Eigentümer erfolgreich auf '{$neuerEigentuemer}' gesetzt.";
} else {
    echo "Fehler: Eigentümer konnte nicht geändert werden.";
}
Eigentümer erfolgreich auf 'www-data' gesetzt.

Eigentümer per numerischer UID setzen

<?php
$datei = '/tmp/beispiel.txt';

// Zunächst Datei erstellen
file_put_contents($datei, 'Testinhalt');

// UID 1000 entspricht häufig dem ersten normalen Benutzer
$uid = 1000;

if (chown($datei, $uid)) {
    $info = posix_getpwuid($uid);
    echo "Eigentümer auf UID {$uid} (" . $info['name'] . ") gesetzt.";
} else {
    echo "Fehler beim Setzen des Eigentümers.";
}
Eigentümer auf UID 1000 (mustermann) gesetzt.

Eigentümer nach dem Erstellen einer hochgeladenen Datei korrigieren

<?php
// Beispiel: Deployment-Skript läuft als root, Datei soll nginx gehören
$zielPfad = '/var/www/html/config/settings.json';

file_put_contents($zielPfad, json_encode(['debug' => false]));

if (!chown($zielPfad, 'nginx')) {
    error_log('Warnung: chown() für ' . $zielPfad . ' fehlgeschlagen.');
}

// Auch Gruppe setzen
if (!chgrp($zielPfad, 'nginx')) {
    error_log('Warnung: chgrp() für ' . $zielPfad . ' fehlgeschlagen.');
}

echo 'Konfigurationsdatei erstellt und Berechtigungen gesetzt.';
Konfigurationsdatei erstellt und Berechtigungen gesetzt.

// Wichtig · Fallstricke

Nur unter Unix/Linux verfügbar: Unter Windows gibt chown() immer false zurück und hat keine Wirkung.

Berechtigungen erforderlich: Nur der root-Benutzer darf den Eigentümer einer Datei beliebig ändern. Ein normaler Benutzer kann den Eigentümer einer Datei, die ihm gehört, nur auf sich selbst setzen oder – je nach Systemkonfiguration – gar nicht ändern.

Symbolische Links: chown() folgt symbolischen Links und ändert den Eigentümer der Zieldatei. Um den Eigentümer eines symbolischen Links selbst zu ändern, verwende lchown().

Sicherheit: Beim Einsatz in Web-Skripten sollte chown() nur mit sorgfältig validierten Pfaden aufgerufen werden, um Path-Traversal-Angriffe zu vermeiden. Niemals vom Benutzer übergebene Dateipfade ungefiltert verwenden.