W3docs

is_writeable()

Die is_writable()-Funktion in PHP prüft, ob eine Datei oder ein Verzeichnis schreibbar ist, und gibt true oder false zurück.

Was die is_writable()-Funktion macht

Die is_writable()-Funktion ist eine eingebaute PHP-Funktion, die prüft, ob ein angegebener Pfad existiert und vom aktuellen Prozess beschrieben werden kann. Sie funktioniert sowohl für Dateien als auch für Verzeichnisse. Sie gibt true zurück, wenn der Pfad existiert und schreibbar ist, andernfalls false — auch dann, wenn der Pfad überhaupt nicht existiert.

Diese Seite behandelt die Syntax, den Rückgabewert, häufige praktische Anwendungen sowie Fallstricke (Caching, Symlinks, Root und die veraltete Schreibweise is_writeable()), über die man leicht stolpern kann.

is_writeable() vs. is_writable()

is_writeable() (mit dem zusätzlichen e) ist ein alter Alias von is_writable(). Er wurde in PHP 5.0.0 als veraltet markiert und in PHP 8.0.0 entfernt; ein Aufruf löst dort jetzt einen fatalen Error aus. Verwenden Sie in modernem Code stets die kanonische Schreibweise is_writable().

Syntax

is_writable(string $filename): bool
ParameterBeschreibung
$filenameDer Pfad zur Datei oder zum Verzeichnis, das geprüft werden soll. Kann relativ (aufgelöst gegenüber dem aktuellen Arbeitsverzeichnis) oder absolut sein.

Rückgabewert: true, wenn $filename existiert und schreibbar ist, andernfalls false. Ein nicht existierender Pfad gibt false zurück, anstatt einen Fehler auszulösen.

Einfaches Beispiel

php— editable, runs on the server

Die Funktion gibt einen boolean zurück und lässt sich daher direkt in einer if-Bedingung verwenden. Die angezeigte Meldung hängt davon ab, ob der Prozess, der das Skript ausführt, Schreibberechtigung für /path/to/file hat.

Ein sicheres Schreibmuster

Die häufigste Verwendung ist das Absichern eines Schreibvorgangs, damit das Skript bei fehlenden Berechtigungen sauber abbricht, statt mit einer Warnung abzustürzen:

<?php

$logFile = __DIR__ . '/app.log';

if (is_writable($logFile)) {
    file_put_contents($logFile, "Started at " . date('c') . "\n", FILE_APPEND);
    echo "Log entry written.";
} else {
    echo "Cannot write to $logFile — check permissions.";
}

Beachten Sie, dass is_writable() einen bereits vorhandenen Pfad prüft. Wenn die Datei noch nicht existiert, sollten Sie stattdessen das Verzeichnis prüfen, das sie enthalten soll, da zum Anlegen einer neuen Datei Schreibberechtigung auf dem übergeordneten Verzeichnis erforderlich ist:

<?php

$target = __DIR__ . '/cache/data.json';

if (is_writable(dirname($target))) {
    file_put_contents($target, '{}');
    echo "File created.";
} else {
    echo "The cache directory is not writable.";
}

Wichtige Hinweise

  • Ergebnisse werden gecacht. PHP speichert Dateisystem-Metadaten im Stat-Cache. Wenn Sie während eines Skripts Berechtigungen ändern (z. B. mit chmod()) und denselben Pfad erneut prüfen, rufen Sie zuerst clearstatcache() auf, um ein aktuelles Ergebnis zu erhalten.
  • Es wird der Prozessbesitzer geprüft, nicht Ihr Login. Ein Pfad, der in Ihrem Terminal schreibbar ist, muss für den Webserver-Benutzer (www-data, nginx usw.), der PHP tatsächlich ausführt, nicht schreibbar sein.
  • Als Root ausführen. Der Superuser kann fast überall schreiben, daher kann is_writable() auch bei als schreibgeschützt markierten Dateien true zurückgeben. Verlassen Sie sich nicht darauf als Sicherheitsgrenze.
  • Symlinks werden verfolgt. Die Prüfung gilt für das Ziel eines symbolischen Links, nicht für den Link selbst.
  • Race Conditions (TOCTOU). Ein Pfad kann zwischen der Prüfung und dem eigentlichen Schreibvorgang nicht mehr schreibbar sein. Bei kritischen Schreibvorgängen sollten Sie den Schreibversuch unternehmen und Fehler behandeln, anstatt sich allein auf die Prüfung zu verlassen.
<?php

chmod('/tmp/example.txt', 0644);
var_dump(is_writable('/tmp/example.txt')); // may show stale value
clearstatcache();                          // refresh the stat cache
var_dump(is_writable('/tmp/example.txt')); // now reflects the new permissions

Verwandte Funktionen

Fazit

is_writable() ermöglicht es Ihnen, vor dem Schreiben zu prüfen, ob eine Datei oder ein Verzeichnis vom aktuellen Prozess beschrieben werden kann — bei nicht vorhandenen Pfaden gibt die Funktion false zurück, anstatt einen Fehler auszulösen. Denken Sie daran, beim Anlegen neuer Dateien das übergeordnete Verzeichnis zu prüfen, nach Berechtigungsänderungen während des Skripts clearstatcache() aufzurufen und die kanonische Schreibweise zu verwenden, da is_writeable() in PHP 8 entfernt wurde.

Übungen

Übung
Was macht die is_writable()-Funktion in PHP?
Was macht die is_writable()-Funktion in PHP?
Was this page helpful?