umask()
Die PHP-Funktion umask() setzt die Standardberechtigungen für neue Dateien und Verzeichnisse. Syntax, Parameter und praktische Beispiele.
Einführung
In PHP setzt die Funktion umask() die Standardberechtigungen für neu erstellte Dateien und Verzeichnisse. Sie ist ein nützliches Werkzeug zur Verwaltung des Dateizugriffs in Ihren Skripten. In diesem Artikel behandeln wir alles Wissenswerte über umask(), einschließlich Syntax, Parameter und praktischer Beispiele.
Die Funktion umask() verstehen
Die umask (user file-creation mode mask) ist eine Menge von Berechtigungs-Bits, die das Betriebssystem aus den Standardberechtigungen entfernt, wenn ein Prozess eine Datei oder ein Verzeichnis erstellt. Die Funktion umask() liest oder ändert diese Maske für den aktuellen PHP-Prozess.
- Sie akzeptiert einen optionalen Parameter
$mask. Wird sie ohne Argumente aufgerufen, gibt sie die aktuelle Maske zurück, ohne etwas zu ändern. - Wird eine Maske übergeben, wird diese zur neuen Maske und die Funktion gibt den vorherigen Maskenwert zurück.
- Die Maske gilt für den gesamten PHP-Prozess, nicht nur für das aktuelle Skript — eine Änderung kann daher spätere Dateioperationen in derselben Anfrage beeinflussen.
PHP beginnt mit den Basis-Berechtigungen des Systems — typischerweise 0666 für Dateien (Lesen + Schreiben, kein Ausführen) und 0777 für Verzeichnisse — und berechnet die endgültigen Berechtigungen mit einem bitweisen AND gegen die invertierte Maske:
final = base & ~maskWie die Masken-Mathematik funktioniert
Die Maske löscht die Bits, die sie enthält. Jede Oktalziffer entspricht Eigentümer, Gruppe und Anderen, und jede Ziffer ist eine Summe aus Lesen (4), Schreiben (2) und Ausführen (1).
Mit umask(022):
files: 0666 & ~022 = 0666 & 0755 = 0644 (rw-r--r--)
directories: 0777 & ~022 = 0777 & 0755 = 0755 (rwxr-xr-x)Die 2 in den Positionen für Gruppe und Andere entfernt das Schreib-Bit, sodass Gruppe und Andere lesen, aber nicht schreiben können. Eine strengere umask(077) würde alle Berechtigungen für Gruppe/Andere löschen und 0600 für Dateien sowie 0700 für Verzeichnisse ergeben — Dateien, auf die nur der Eigentümer zugreifen kann.
Syntax der Funktion umask()
Die Syntax der Funktion umask() lautet wie folgt:
umask($mask);Hier ist $mask die neue Maske. Sie muss in Oktalschreibweise angegeben werden, schreiben Sie sie daher immer mit einer führenden Null (z. B. 022). Das Schreiben von 22 würde als Dezimalwert 22 interpretiert, nicht als die beabsichtigte Oktalmaske.
Beispiele zur Verwendung von umask()
Beispiel 1: Standardberechtigungen für neue Dateien festlegen
<?php
umask(022);
$file_handle = fopen('example.txt', 'w');
fclose($file_handle);
echo 'File permissions: ' . decoct(fileperms('example.txt') & 0777);
unlink('example.txt');Ausgabe:
File permissions: 644Dies setzt die Maske auf 022 und erstellt dann example.txt. Die Basis-Dateiberechtigung 0666 abzüglich der maskierten Schreib-Bits ergibt 0644. Der Aufruf von fileperms() liest die tatsächlichen Berechtigungen zurück, und & 0777 entfernt die Dateityp-Bits, sodass decoct() nur den Zugriffsteil ausgibt.
Beispiel 2: Die aktuelle Maske lesen und wiederherstellen
Da die Maske den gesamten Prozess betrifft, sollte eine gut geschriebene Funktion sie nach Abschluss wiederherstellen. Ein Aufruf von umask() ohne Argument gibt den aktuellen Wert zurück, ohne ihn zu ändern.
<?php
// Save the current mask, then apply a strict one
$old = umask(077);
$dir = sys_get_temp_dir() . '/private';
mkdir($dir);
echo 'Dir permissions: ' . decoct(fileperms($dir) & 0777) . "\n";
// Restore the original mask
umask($old);
echo 'Restored mask: ' . decoct(umask()) . "\n";
rmdir($dir);Ausgabe:
Dir permissions: 700
Restored mask: 22Hier löscht umask(077) alle Bits für Gruppe und Andere, sodass das neue Verzeichnis 0777 & ~077 = 0700 erhält — nur vom Eigentümer zugänglich. Das Speichern der vorherigen Maske in $old und die Rückgabe an umask() hinterlässt den Prozess in dem Zustand, in dem er begonnen hat.
Häufige Fallstricke
umask()gilt prozessweit. In langlebigen Kontexten (FPM-Worker, CLI-Daemons) kann derumask()-Aufruf eines Skripts in spätere Anfragen desselben Workers hineinwirken. Stellen Sie den vorherigen Wert immer wieder her, wie in Beispiel 2.- Sie betrifft nur die Erstellung. Bestehende Dateien bleiben unverändert; verwenden Sie
chmod(), um Berechtigungen nachträglich zu ändern. - Das Betriebssystem begrenzt das Ergebnis.
umask()kann Bits nur entfernen. Es kann das Ausführ-Bit nicht zu einer regulären Datei hinzufügen, da der Basismodus für Dateien bereits0666ist. - Die führende Null vergessen.
umask(22)undumask(022)bedeuten unterschiedliche Dinge — das erste ist dezimal, das zweite ist oktal.
Verwandte Funktionen
chmod()— Berechtigungen einer vorhandenen Datei oder eines Verzeichnisses ändern.fileperms()— die aktuellen Berechtigungs-Bits einer Datei lesen.mkdir()— ein Verzeichnis erstellen (das mode-Argument wird ebenfalls durch die umask gefiltert).fopen()— eine Datei öffnen oder erstellen.
Fazit
Die Funktion umask() steuert, welche Berechtigungs-Bits von neu erstellten Dateien und Verzeichnissen entfernt werden. Denken Sie daran, dass sie durch Entfernen von Bits (base & ~mask) arbeitet, prozessweit gilt und nur neue Erstellungen betrifft. Wenn Sie sie innerhalb einer Funktion ändern, speichern und stellen Sie den vorherigen Wert wieder her, um spätere Code-Überraschungen zu vermeiden.