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| Parameter | Beschreibung |
|---|---|
$filename | Der 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
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 zuerstclearstatcache()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,nginxusw.), 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 Dateientruezurü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 permissionsVerwandte Funktionen
is_readable()— prüft, ob ein Pfad gelesen werden kann.file_exists()— prüft nur, ob ein Pfad existiert.is_file()undis_dir()— unterscheidet Dateien von Verzeichnissen.chmod()— ändert die Berechtigungen eines Pfads.file_put_contents()undfwrite()— die Schreiboperationen, die Sie typischerweise mitis_writable()absichern.
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.