Start · Sprachen · PHP · Referenz · eio_fchmod

eio_fchmod

Funktion

Ändert die Zugriffsberechtigungen einer geöffneten Datei asynchron über einen Dateideskriptor.

seit PHP 0.0.1dev Kategorie: io

Signatur

eio_fchmod(mixed $fd, int $mode, int $pri = EIO_PRI_DEFAULT, callable $callback = null, mixed $data = null): resource|false

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

Typ
resource|false
Beschreibung
Gibt eine EIO-Request-Ressource zurück, wenn die Anfrage erfolgreich in die Warteschlange gestellt wurde, oder 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 erfolgreich geändert.

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();
Neue Berechtigungen: 0755

// 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.