Signatur
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
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 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();
// 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.