W3docs

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 & ~mask

Wie 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: 644

Dies 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: 22

Hier 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 der umask()-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 bereits 0666 ist.
  • Die führende Null vergessen. umask(22) und umask(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.

Übung

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