filegroup()
Die PHP-Funktion filegroup() gibt die Gruppen-ID einer Datei als Integer zurück oder false bei einem Fehler.
Die Funktion filegroup() gibt die Gruppen-ID der besitzenden Gruppe einer Datei zurück. Auf Unix-ähnlichen Systemen gehört jede Datei einem Benutzer und einer Gruppe; filegroup() liefert die numerische ID dieser Gruppe. Dieses Kapitel behandelt die Syntax, den Rückgabewert, die Umwandlung der numerischen ID in einen Gruppennamen, häufige Fallstricke sowie die Einordnung dieser Funktion unter PHPs andere Dateiinspektionsfunktionen.
Syntax
filegroup(string $filename): int|false$filename ist der Pfad zur zu untersuchenden Datei (oder dem Verzeichnis). Bei Erfolg gibt die Funktion die Gruppen-ID als Integer zurück. Bei einem Fehler gibt sie false zurück.
Einige wichtige Hinweise vorab:
- Die Gruppen-ID ist eine Zahl, kein Name. Auf den meisten Systemen ist
0die Grupperoot/wheel, aber die genaue Zuordnung ist systemspezifisch. - Das Ergebnis wird zwischengespeichert. PHP speichert
stat()-Daten pro Datei im Cache; ändert sich die Gruppe einer Datei während der Skriptausführung, muss möglicherweiseclearstatcache()aufgerufen werden, um den neuen Wert zu sehen. - Unter Windows gilt das Konzept einer Dateigruppe nicht, und
filegroup()ist dort nicht sinnvoll einsetzbar.
Einfaches Beispiel
<?php
$filename = __FILE__; // the script file itself — guaranteed to exist
$groupId = filegroup($filename);
echo "The group ID of $filename is $groupId";Die Verwendung von __FILE__ stellt sicher, dass der Pfad existiert, sodass das Beispiel reproduzierbar ist. Die Ausgabe ist eine Zahl wie:
The group ID of /var/www/example.php is 33Die ID in einen Gruppennamen umwandeln
Eine rohe Zahl ist selten das, was man anzeigen möchte. Auf Systemen mit der POSIX-Erweiterung kann sie mit posix_getgrgid() in einen lesbaren Namen aufgelöst werden:
<?php
$groupId = filegroup(__FILE__);
if ($groupId === false) {
echo "Could not read the file group.";
} elseif (function_exists('posix_getgrgid')) {
$group = posix_getgrgid($groupId);
echo "Group name: " . $group['name']; // e.g. "www-data"
} else {
echo "Group ID: $groupId";
}Hinweis:
posix_getgrgid()ist Teil der POSIX-Erweiterung und unter Windows nicht verfügbar. Sichern Sie den Aufruf immer mitfunction_exists()ab, wenn Ihr Code plattformübergreifend ausgeführt werden könnte.
Fehlerbehandlung
Wenn die Datei nicht existiert oder nicht zugänglich ist, gibt filegroup() false zurück und erzeugt eine E_WARNING. Da false mit 0 (einer gültigen Gruppen-ID für root) verwechselt werden könnte, sollte stets der strikte Operator === zum Vergleich verwendet werden:
<?php
$result = filegroup('does-not-exist.txt');
if ($result === false) {
echo "Unable to determine the file group.";
} else {
echo "Group ID: $result";
}Um die Warnung zu unterdrücken, wenn eine fehlende Datei ein erwarteter Fall ist, prüfen Sie zunächst mit file_exists(), ob die Datei existiert, anstatt die Warnung mit dem Operator @ zu unterdrücken.
Wann ist diese Funktion sinnvoll?
filegroup() ist nützlich, wenn Sie Dateieigentümerschaft prüfen oder überprüfen möchten — zum Beispiel, um sicherzustellen, dass hochgeladene Dateien oder generierte Cache-Dateien zur Webserver-Gruppe (häufig www-data) gehören, damit der Server sie lesen und schreiben kann. Sie wird häufig zusammen mit folgenden Funktionen verwendet:
fileowner()— die Benutzer-ID, der die Datei gehört.fileperms()— die Berechtigungsbits der Datei.filetype()— ob es sich um eine Datei, ein Verzeichnis, einen Link usw. handelt.stat()— all das (und mehr) in einem einzigen Aufruf.
Fazit
filegroup() gibt die numerische Gruppen-ID einer Datei zurück oder false bei einem Fehler. Kombinieren Sie sie mit posix_getgrgid(), um einen menschenlesbaren Gruppennamen anzuzeigen. Vergleichen Sie das Ergebnis stets mit ===, um einen Fehler von einer legitimen 0 zu unterscheiden, und denken Sie an clearstatcache(), wenn sich die Eigentümerschaft möglicherweise während der Skriptausführung geändert hat. Für ein vollständigeres Bild der Metadaten einer Datei greifen Sie auf fileowner(), fileperms() und stat() zurück.