Signatur
Beschreibung
eio_fchmod() ist Teil der EIO-Erweiterung (Asynchronous I/O) und ändert die Zugriffsberechtigungen einer bereits geöffneten Datei, die durch einen Dateideskriptor $fd referenziert wird. Der Vorgang entspricht dem POSIX-Aufruf fchmod(2) und wird non-blocking in einem Worker-Thread ausgeführt.
Im Gegensatz zu eio_chmod(), das einen Dateipfad erwartet, arbeitet eio_fchmod() direkt mit einem bereits geöffneten Dateideskriptor. Dies ist vor allem dann nützlich, wenn die Datei bereits geöffnet ist und man gleichzeitig Race-Conditions durch das erneute Öffnen über einen Pfad vermeiden möchte.
Der Parameter $mode gibt die neuen Berechtigungen im oktalen Format an (z. B. 0644 für Lesen/Schreiben für den Eigentümer, Lesen für Gruppe und Andere). Nach Abschluss des Vorgangs wird die $callback-Funktion aufgerufen, der das Ergebnis sowie optionale benutzerdefinierte Daten $data übergeben werden.
Die Funktion setzt eine laufende Event-Loop voraus, typischerweise über eio_event_loop() oder in Kombination mit einer Bibliothek wie libevent oder React.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $fd Pflicht | mixed | Geöffneter Dateideskriptor, z. B. zurückgegeben von eio_open() oder einer anderen Datei-öffnenden EIO-Funktion. |
|
| $mode Pflicht | int | Neue Dateiberechtigungen als oktale Ganzzahl, z. B. 0644 oder 0755. |
|
| $pri | int | EIO_PRI_DEFAULT | Priorität der Anfrage. Mögliche Werte: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX. |
| $callback | callable | null | Callback-Funktion, die nach Abschluss der Operation aufgerufen wird. Signatur: function(mixed $data, int $result): void. $result ist 0 bei Erfolg, sonst -1. |
| $data | mixed | null | Beliebige benutzerdefinierte Daten, die unverändert an den $callback weitergegeben werden. |
Rückgabewert
false bei einem Fehler.Beispiele
Dateiberechtigungen asynchron ändern
<?php
// Setzt voraus, dass die EIO-Erweiterung installiert ist
$filename = '/tmp/testfile.txt';
file_put_contents($filename, 'Hello EIO');
// Datei asynchron öffnen
eio_open(
$filename,
EIO_O_RDWR,
0600,
EIO_PRI_DEFAULT,
function ($data, $result, $req) use ($filename) {
if ($result < 0) {
echo "Fehler beim Öffnen: " . eio_get_last_error($req) . PHP_EOL;
return;
}
$fd = $result;
// Berechtigungen auf 0644 setzen
eio_fchmod(
$fd,
0644,
EIO_PRI_DEFAULT,
function ($data, $result, $req) use ($fd) {
if ($result === 0) {
echo "Berechtigungen erfolgreich geändert." . PHP_EOL;
} else {
echo "Fehler beim Ändern der Berechtigungen." . PHP_EOL;
}
// Dateideskriptor schließen
eio_close($fd);
}
);
}
);
eio_event_loop();
Berechtigungen prüfen nach asynchroner Änderung
<?php
$filename = '/tmp/eio_test.txt';
file_put_contents($filename, 'Test');
chmod($filename, 0600);
eio_open(
$filename,
EIO_O_RDONLY,
0,
EIO_PRI_DEFAULT,
function ($data, $fd, $req) use ($filename) {
if ($fd < 0) {
echo "Öffnen fehlgeschlagen." . PHP_EOL;
return;
}
eio_fchmod(
$fd,
0755,
EIO_PRI_DEFAULT,
function ($data, $result, $req) use ($fd, $filename) {
eio_close($fd);
clearstatcache();
$perms = substr(sprintf('%o', fileperms($filename)), -4);
echo "Neue Berechtigungen: " . $perms . PHP_EOL;
}
);
}
);
eio_event_loop();
// Wichtig · Fallstricke
Sicherheitshinweis: Vermeiden Sie großzügige Berechtigungen wie 0777, insbesondere auf Webservern. Setzen Sie nur die minimal notwendigen Rechte.
Die EIO-Erweiterung ist eine PECL-Erweiterung und muss separat installiert werden (pecl install eio). Sie steht nur auf POSIX-kompatiblen Systemen (Linux, macOS) zur Verfügung; unter Windows ist sie nicht verfügbar.
Achtung: Der Callback erhält als zweiten Parameter $result den Rückgabewert des Systemaufrufs. Ein Wert von -1 zeigt einen Fehler an; der genaue Fehlercode kann über eio_get_last_error() ermittelt werden.