Start · Sprachen · PHP · Referenz · fileperms

fileperms

Funktion

Gibt die Zugriffsrechte (Permissions) einer Datei oder eines Verzeichnisses als Integer zurück.

seit PHP 4.0.0 Kategorie: io

Signatur

fileperms(string $filename): int|false

Beschreibung

fileperms() liest die Dateiberechtigungen des angegebenen Pfades und gibt sie als ganzzahligen Wert zurück. Dieser Wert enthält neben den eigentlichen Berechtigungs-Bits (rwx für Besitzer, Gruppe und Andere) auch den Dateityp im höherwertigen Bereich des Integers.

Um die klassischen Unix-Berechtigungen im oktalen Format zu erhalten (z. B. 0755), muss der Rückgabewert mit dem oktalen Maskenwert 0777 per bitweisem AND verknüpft und anschließend mit decoct() in eine lesbare Oktalzahl umgewandelt werden. Alternativ kann sprintf('%o', fileperms($file)) genutzt werden, um direkt den vollständigen Oktal-String inklusive Dateityp-Bits auszugeben.

Die Funktion eignet sich überall dort, wo Berechtigungen vor dem Lesen, Schreiben oder Ausführen von Dateien geprüft werden müssen – etwa in Deployment-Skripten, Sicherheits-Audits oder bei der Arbeit mit Upload-Verzeichnissen.

Wie viele Dateisystem-Funktionen nutzt fileperms() intern einen Stat-Cache. Werden Berechtigungen kurz zuvor geändert, sollte clearstatcache() aufgerufen werden, um veraltete Werte zu vermeiden.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur Datei oder zum Verzeichnis, dessen Berechtigungen abgefragt werden sollen. Kann relativ oder absolut angegeben werden.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Dateiberechtigungen als Integer zurück. Bei einem Fehler (z. B. Datei nicht vorhanden, kein Zugriff) wird false zurückgegeben und eine E_WARNING-Meldung ausgegeben.

Beispiele

Berechtigungen im Oktalformat ausgeben

<?php
$file = '/var/www/html/index.php';

$perms = fileperms($file);
if ($perms === false) {
    echo "Berechtigungen konnten nicht gelesen werden.";
} else {
    // Nur die unteren 9 Bits (rwxrwxrwx)
    echo 'Oktal (kurz): ' . substr(sprintf('%o', $perms), -4) . PHP_EOL;
    // Vollständige Oktaldarstellung inkl. Dateityp-Bits
    echo 'Oktal (voll): ' . sprintf('%o', $perms) . PHP_EOL;
}
Oktal (kurz): 0644 Oktal (voll): 100644

Berechtigungen menschlich lesbar darstellen

<?php
$file = '/var/www/html';
$perms = fileperms($file);

// Dateityp bestimmen
$info = '';
if (($perms & 0xC000) === 0xC000)      $info = 's'; // Socket
elseif (($perms & 0xA000) === 0xA000)  $info = 'l'; // Symbolischer Link
elseif (($perms & 0x8000) === 0x8000)  $info = '-'; // Reguläre Datei
elseif (($perms & 0x6000) === 0x6000)  $info = 'b'; // Block-Device
elseif (($perms & 0x4000) === 0x4000)  $info = 'd'; // Verzeichnis
elseif (($perms & 0x2000) === 0x2000)  $info = 'c'; // Zeichen-Device
elseif (($perms & 0x1000) === 0x1000)  $info = 'p'; // FIFO
else                                   $info = 'u'; // Unbekannt

// Besitzer
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x') : (($perms & 0x0800) ? 'S' : '-'));
// Gruppe
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x') : (($perms & 0x0400) ? 'S' : '-'));
// Andere
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x') : (($perms & 0x0200) ? 'T' : '-'));

echo $info . PHP_EOL;
drwxr-xr-x

Berechtigungen nach chmod-Aufruf prüfen (mit Cache-Reset)

<?php
$file = '/tmp/testdatei.txt';
file_put_contents($file, 'Test');
chmod($file, 0600);

// Cache leeren, damit der neue Wert gelesen wird
clearstatcache();

$oct = decoct(fileperms($file) & 0777);
echo 'Berechtigungen: ' . $oct . PHP_EOL; // Erwartet: 600
Berechtigungen: 600

// Wichtig · Fallstricke

Stat-Cache: fileperms() verwendet denselben internen Cache wie stat(), file_exists() und andere Dateisystem-Funktionen. Nach Berechtigungsänderungen (z. B. via chmod()) muss clearstatcache() aufgerufen werden, damit aktualisierte Werte zurückgegeben werden.

Windows: Unter Windows ist die Aussagekraft sehr eingeschränkt. Das Betriebssystem unterstützt keine klassischen Unix-Berechtigungsbits; fileperms() gibt dort häufig pauschal 0666 für Dateien und 0777 für Verzeichnisse zurück, unabhängig von den tatsächlichen ACLs.

Symbolische Links: Unter Linux/Unix liefert fileperms() die Berechtigungen des Ziels, nicht des Links selbst. Um die Berechtigungen des Links zu ermitteln, kann lstat() verwendet werden.