W3docs

is_writable()

PHP is_writable() gibt true zurück, wenn eine Datei oder ein Verzeichnis beschreibbar ist. Syntax, Fallstricke und Stat-Cache erklärt.

Die PHP-Funktion is_writable() zeigt Ihnen an, bevor Sie schreiben, ob der aktuelle Prozess berechtigt ist, in eine bestimmte Datei oder ein bestimmtes Verzeichnis zu schreiben. Diese Seite behandelt die Syntax, den Rückgabewert, das Caching-Verhalten, das häufig zu Problemen führt, sowie praktische Muster für die sichere Verwendung.

Was ist die Funktion is_writable()?

is_writable() ist eine eingebaute PHP-Funktion, die true zurückgibt, wenn die angegebene Datei (oder das Verzeichnis) existiert und beschreibbar ist für den Benutzer, unter dem der PHP-Prozess läuft, andernfalls false. Die Funktion nimmt ein Argument entgegen und führt selbst keinen Schreibvorgang durch — sie gibt nur Berechtigungen aus.

Die Prüfung basiert auf der effektiven Benutzer-ID des laufenden Prozesses (zum Beispiel www-data unter Apache/Nginx-FPM), nicht auf dem Benutzer, dem das Skript gehört. Eine Datei, die Sie in Ihrem Editor bearbeiten können, wird dem Webserver gegenüber möglicherweise trotzdem als nicht beschreibbar gemeldet.

is_writable() hat einen Alias, is_writeable() (mit einem zusätzlichen e); beide sind identisch.

Syntax

is_writable(string $filename): bool
ParameterBeschreibung
$filenamePfad zur zu prüfenden Datei oder zum Verzeichnis. Kann relativ zum aktuellen Arbeitsverzeichnis angegeben werden.

Gibt true bei Erfolg zurück, false wenn der Pfad nicht beschreibbar ist oder nicht existiert.

Verwendung der Funktion is_writable()

Das typische Muster ist „erst prüfen, dann handeln" — bestätigen Sie, dass eine Datei beschreibbar ist, bevor Sie sie zum Schreiben öffnen, damit Sie mit einer klaren Fehlermeldung abbrechen können, statt eine Laufzeitwarnung auszulösen.

php— editable, runs on the server

Da die Runner-Sandbox data.txt erstellt, gibt das obige Beispiel The file 'data.txt' is writable. aus.

Ein vollständiges, ausführbares Beispiel

Dieses eigenständige Skript erstellt eine Datei, prüft sie und schreibt nur, wenn die Prüfung erfolgreich war:

<?php

$file = 'log.txt';

// Create the file so the example is reproducible.
file_put_contents($file, "first line\n");

if (is_writable($file)) {
    file_put_contents($file, "second line\n", FILE_APPEND);
    echo "Wrote to $file:\n";
    echo file_get_contents($file);
} else {
    echo "Cannot write to $file.";
}

Ausgabe:

Wrote to log.txt:
first line
second line

Ein Verzeichnis prüfen

is_writable() funktioniert auch für Verzeichnisse. Dies ist die richtige Prüfung, bevor Sie eine neue Datei erstellen: Sie können die Datei nicht prüfen (sie existiert noch nicht), also prüfen Sie den Ordner, der sie enthalten wird.

<?php

$dir = __DIR__; // the directory this script lives in

if (is_writable($dir)) {
    echo "New files can be created in: $dir";
} else {
    echo "Directory is read-only: $dir";
}

Häufige Fallstricke

  • Es wirft keine Ausnahme — es warnt. Wenn $filename auf eine Weise ungültig ist, die PHP nicht auflösen kann (z. B. ein Verstoß gegen open_basedir), gibt PHP möglicherweise eine E_WARNING aus. Der Rückgabewert ist dennoch false. Unterdrücken Sie dies mit @ nur als letztes Mittel.
  • Ergebnisse können zwischengespeichert sein. PHP führt einen Stat-Cache. Wenn sich die Berechtigungen einer Datei während desselben Skriptlaufs ändern, kann is_writable() ein veraltetes Ergebnis zurückgeben. Rufen Sie clearstatcache() vor einer erneuten Prüfung auf, um PHP zu zwingen, das Dateisystem erneut zu lesen.
  • false ist mehrdeutig. Ein false-Ergebnis bedeutet „nicht beschreibbar oder existiert nicht." Wenn Sie zwischen beiden unterscheiden müssen, kombinieren Sie es mit file_exists().
  • TOCTOU-Wettlaufbedingung. Zwischen der is_writable()-Prüfung und dem tatsächlichen Schreibvorgang könnten sich die Berechtigungen der Datei ändern. Verlassen Sie sich bei kritischem Code nicht allein auf die Prüfung — behandeln Sie auch den Fehler des eigentlichen Schreibvorgangs.

Wenn Sie Berechtigungen mitten im Skript ändern und erneut prüfen, leeren Sie zuerst den Cache:

<?php

$file = 'config.ini';
file_put_contents($file, "data\n");

var_dump(is_writable($file)); // bool(true)

chmod($file, 0444);  // make it read-only
clearstatcache();    // force PHP to re-read the filesystem
var_dump(is_writable($file)); // bool(false)

Ausgabe:

bool(true)
bool(false)

Verwandte Funktionen

  • is_readable() — das Gegenstück für Leseberechtigungen.
  • file_exists() — Existenz prüfen ohne Berechtigungen zu prüfen.
  • is_file() — bestätigen, dass ein Pfad eine reguläre Datei ist.
  • fopen() / fwrite() — Dateien öffnen und schreiben, sobald die Prüfung erfolgreich war.
  • chmod() — die Berechtigungsbits einer Datei ändern.

Fazit

is_writable() ermöglicht es Ihrem Skript, den Schreibzugriff im Voraus zu bestätigen und kontrolliert zu scheitern, anstatt Laufzeitwarnungen auszulösen. Beachten Sie die drei Eigenheiten: Es spiegelt die Berechtigungen des Prozess-Benutzers wider, false bedeutet auch „nicht vorhanden", und die Ergebnisse werden zwischengespeichert, bis Sie clearstatcache() aufrufen. Kombinieren Sie es mit der Fehlerbehandlung des eigentlichen Schreibvorgangs für robusten Datei-Code.

Übungen

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