Signatur
Beschreibung
eio_syncfs() ist Teil der EIO-Erweiterung und führt den Linux-Systemaufruf syncfs(2) asynchron aus. Im Gegensatz zu sync(), das alle Dateisysteme synchronisiert, beschränkt sich syncfs() auf das Dateisystem, zu dem der übergebene Dateideskriptor gehört. Dadurch wird die Synchronisierungszeit erheblich reduziert, wenn nur ein einzelnes Dateisystem gespült werden muss.
Die Funktion ist sinnvoll, wenn nach einer Reihe von Schreiboperationen sichergestellt werden soll, dass die Daten wirklich auf das physische Medium geschrieben wurden — beispielsweise vor dem sicheren Auswerfen eines Laufwerks, nach kritischen Transaktionen oder für Journaling-Zwecke. Da EIO auf einem Thread-Pool basiert, blockiert der Aufruf den PHP-Prozess nicht; das Ergebnis wird über die $callback-Funktion geliefert.
Wichtig: syncfs(2) ist ein Linux-spezifischer Systemaufruf und steht auf anderen Betriebssystemen (z. B. macOS, Windows) nicht zur Verfügung. Die Funktion gibt false zurück, wenn der Systemaufruf auf der aktuellen Plattform nicht unterstützt wird.
Damit EIO-Anfragen verarbeitet werden, muss die Ereignisschleife aktiv sein (z. B. über eio_event_loop() oder eine Integration mit libevent / ReactPHP).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $fd Pflicht | mixed | Ein geöffneter Dateideskriptor (z. B. über fopen() oder eio_open() erhalten), der zu dem Dateisystem gehört, das synchronisiert werden soll. |
|
| $pri | int | EIO_PRI_DEFAULT | Priorität der Anfrage. Mögliche Werte: EIO_PRI_MIN, EIO_PRI_DEFAULT, EIO_PRI_MAX. |
| $callback | callable | null | Callback-Funktion, die nach Abschluss der Operation aufgerufen wird. Signatur: function(mixed $data, mixed $result): void. $result enthält 0 bei Erfolg oder -1 bei einem Fehler. |
| $data | mixed | null | Beliebige benutzerdefinierte Daten, die unverändert an den $callback weitergegeben werden. |
Rückgabewert
false, wenn die Anfrage nicht erstellt werden konnte bzw. syncfs(2) auf dem System nicht verfügbar ist.Beispiele
Dateisystem nach Schreiboperationen synchronisieren
<?php
// EIO-Erweiterung muss geladen sein
$fd = fopen('/tmp/testfile.txt', 'w');
fwrite($fd, 'Wichtige Daten');
// Dateisystem asynchron syncen
$req = eio_syncfs($fd, EIO_PRI_DEFAULT, function($data, $result) use ($fd) {
if ($result === 0) {
echo "Dateisystem erfolgreich synchronisiert.\n";
} else {
echo "Fehler beim Synchronisieren: " . eio_get_last_error($data) . "\n";
}
fclose($fd);
}, null);
// Ereignisschleife starten, bis alle Anfragen abgearbeitet sind
eio_event_loop();
Plattformprüfung vor Verwendung
<?php
// Prüfen, ob syncfs auf diesem System verfügbar ist
if (!function_exists('eio_syncfs')) {
echo "eio_syncfs ist nicht verfügbar.\n";
exit;
}
$fd = fopen('/var/data/log.txt', 'a');
fwrite($fd, date('Y-m-d H:i:s') . " - Transaktion abgeschlossen\n");
eio_syncfs($fd, EIO_PRI_DEFAULT, function($data, $result) use ($fd) {
echo $result === 0
? "Sync erfolgreich — Daten sind persistent.\n"
: "Sync fehlgeschlagen.\n";
fclose($fd);
});
eio_event_loop();
// Wichtig · Fallstricke
Plattformabhängigkeit: syncfs(2) ist ein Linux-spezifischer Systemaufruf (seit Linux 2.6.39). Auf macOS, BSD oder Windows steht er nicht zur Verfügung. PHP gibt in diesem Fall false zurück oder fällt auf einen Ersatz-Systemaufruf zurück — das Verhalten hängt von der libeio-Version ab.
Blockierung: EIO-Operationen laufen in einem Thread-Pool und blockieren den Haupt-Thread nicht. Die Ereignisschleife (eio_event_loop()) muss jedoch aufgerufen werden, damit die Callbacks ausgeführt werden.
Kein Ersatz für Transaktionen: eio_syncfs() garantiert nur, dass Daten auf das Speichermedium geschrieben werden. Es stellt keine Datenbankähnliche Atomizität sicher. Für transaktionale Sicherheit sind Datenbankfunktionen oder Journaling-Dateisysteme vorzuziehen.