Start · Sprachen · PHP · Referenz · eio_futime

eio_futime

Funktion

Ändert asynchron die Zugriffs- und Änderungszeit einer geöffneten Datei anhand ihres Dateideskriptors.

seit PHP 1.0.0 Kategorie: io

Signatur

eio_futime(mixed $fd, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, callable $callback = null, mixed $data = null): resource

Beschreibung

eio_futime() ist die asynchrone Variante von utime() bzw. touch(), arbeitet jedoch mit einem bereits geöffneten Dateideskriptor statt mit einem Dateipfad. Die Funktion gehört zur eio-Erweiterung, die nicht-blockierende I/O-Operationen über die libeio-Bibliothek bereitstellt.

Über die Parameter atime (Zugriffszeit) und mtime (Änderungszeit) können beliebige UNIX-Zeitstempel als Fließkommazahl übergeben werden, sodass auch Sub-Sekunden-Präzision möglich ist. Dies ist nützlich, wenn Zeitstempel beim Kopieren oder Archivieren von Dateien beibehalten werden sollen.

Die Operation wird asynchron ausgeführt. Das Ergebnis wird über die callback-Funktion geliefert, sobald die Operation abgeschlossen ist. Die Callback-Signatur lautet: callback(mixed $data, int $result), wobei $result bei Erfolg 0 und bei Fehler -1 ist.

Wichtig: Die eio-Erweiterung ist typischerweise zusammen mit einem Event-Loop (z. B. eio_event_loop()) zu nutzen, damit die asynchronen Operationen tatsächlich ausgeführt und die Callbacks aufgerufen werden.

Parameter

Name Typ Default Beschreibung
$fd Pflicht mixed Geöffneter Dateideskriptor, wie er von eio_open() oder einer vergleichbaren Funktion zurückgegeben wurde.
$atime Pflicht float Neuer Zugriffszeit-Zeitstempel als UNIX-Zeitstempel (Sekunden seit 1970-01-01). Fließkommazahlen erlauben Sub-Sekunden-Genauigkeit.
$mtime Pflicht float Neuer Änderungszeit-Zeitstempel als UNIX-Zeitstempel (Sekunden seit 1970-01-01). Fließkommazahlen erlauben Sub-Sekunden-Genauigkeit.
$pri int EIO_PRI_DEFAULT Priorität der asynchronen Operation. 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: callback(mixed $data, int $result). $result ist 0 bei Erfolg, -1 bei Fehler.
$data mixed null Beliebige benutzerdefinierte Daten, die unverändert an den Callback weitergegeben werden. Nützlich für Kontext-Informationen innerhalb des Callbacks.

Rückgabewert

Typ
resource
Beschreibung
Gibt eine eio-Request-Ressource zurück, die die ausstehende asynchrone Operation repräsentiert, oder false bei einem Fehler.

Beispiele

Zeitstempel einer geöffneten Datei asynchron anpassen

<?php
// eio-Erweiterung muss geladen sein
$atime = microtime(true);       // aktuelle Zeit als Zugriffszeit
$mtime = strtotime('2023-01-01 12:00:00'); // feste Änderungszeit

// Datei zum Schreiben öffnen
eio_open('/tmp/testfile.txt', EIO_O_CREAT | EIO_O_WRONLY, 0644, EIO_PRI_DEFAULT,
    function ($data, $result) use ($atime, $mtime) {
        if ($result === -1) {
            echo "Fehler beim Öffnen der Datei\n";
            return;
        }
        $fd = $result;

        // Zeitstempel asynchron ändern
        eio_futime($fd, $atime, $mtime, EIO_PRI_DEFAULT,
            function ($data, $result) use ($fd) {
                if ($result === 0) {
                    echo "Zeitstempel erfolgreich geändert\n";
                } else {
                    echo "Fehler beim Ändern des Zeitstempels\n";
                }
                // Dateideskriptor schließen
                eio_close($fd);
            }
        );
    }
);

// Event-Loop starten, bis alle Operationen abgeschlossen sind
eio_event_loop();
Zeitstempel erfolgreich geändert

Zeitstempel beim Archivieren beibehalten

<?php
$sourcePath = '/tmp/original.txt';
$destPath   = '/tmp/kopie.txt';

// Originale Zeitstempel auslesen
$stat = stat($sourcePath);
$origAtime = (float)$stat['atime'];
$origMtime = (float)$stat['mtime'];

// Zieldatei öffnen (oder anlegen)
eio_open($destPath, EIO_O_CREAT | EIO_O_WRONLY, 0644, EIO_PRI_DEFAULT,
    function ($data, $fd) use ($origAtime, $origMtime) {
        if ($fd === -1) {
            echo "Öffnen fehlgeschlagen\n";
            return;
        }

        // Zeitstempel der Quelldatei auf die Zieldatei übertragen
        eio_futime($fd, $origAtime, $origMtime, EIO_PRI_DEFAULT,
            function ($data, $result) use ($fd) {
                echo $result === 0
                    ? "Zeitstempel der Quelldatei übertragen.\n"
                    : "Fehler beim Setzen der Zeitstempel.\n";
                eio_close($fd);
            }
        );
    }
);

eio_event_loop();
Zeitstempel der Quelldatei übertragen.

// Wichtig · Fallstricke

Voraussetzung: Die eio-PECL-Erweiterung muss installiert und aktiviert sein (pecl install eio). Sie ist nicht Bestandteil der PHP-Standardinstallation.

Die Funktion ist für den Einsatz in ereignisgesteuerten Anwendungen (z. B. mit ReactPHP oder Ev) konzipiert. In synchronen Skripten bietet sich stattdessen touch() an.

Wird ein ungültiger oder bereits geschlossener Dateideskriptor übergeben, schlägt die Operation fehl ($result === -1 im Callback). Fehlerdetails können über eio_get_last_error() abgerufen werden.