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| Parameter | Beschreibung |
|---|---|
$filename | Pfad 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.
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 lineEin 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
$filenameauf eine Weise ungültig ist, die PHP nicht auflösen kann (z. B. ein Verstoß gegen open_basedir), gibt PHP möglicherweise eineE_WARNINGaus. Der Rückgabewert ist dennochfalse. 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 Sieclearstatcache()vor einer erneuten Prüfung auf, um PHP zu zwingen, das Dateisystem erneut zu lesen. falseist mehrdeutig. Einfalse-Ergebnis bedeutet „nicht beschreibbar oder existiert nicht." Wenn Sie zwischen beiden unterscheiden müssen, kombinieren Sie es mitfile_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.