Signatur
Beschreibung
fflush() erzwingt das Leeren des internen Schreibpuffers des über $handle referenzierten Datei-Streams. Normalerweise puffert das Betriebssystem bzw. die C-Laufzeitbibliothek Schreiboperationen, um die I/O-Performance zu verbessern. Mit fflush() werden alle noch nicht geschriebenen Pufferdaten sofort auf das zugrundeliegende Speichermedium übertragen.
Diese Funktion ist besonders nützlich, wenn mehrere Prozesse oder Threads auf dieselbe Datei zugreifen und sichergestellt werden muss, dass ein anderer Prozess die aktuellsten Daten liest. Ebenso wichtig ist sie beim Schreiben von Log-Dateien, wo Datenverlust im Falle eines Absturzes minimiert werden soll.
Zu beachten ist, dass fflush() den Puffer der PHP/C-Bibliothek leert, aber nicht zwingend einen fsync auf Betriebssystemebene durchführt. Für eine garantierte physische Persistenz auf der Festplatte sollte zusätzlich fsync() aufgerufen werden.
fflush() funktioniert mit allen Datei-Streams, die über fopen(), tmpfile() oder ähnliche Funktionen geöffnet wurden, und ist nur für Schreiboperationen relevant.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $handle Pflicht | resource | Ein gültiger Datei-Handle, der mit fopen(), popen() oder einer ähnlichen Funktion geöffnet wurde und auf den im Schreibmodus zugegriffen wird. |
Rückgabewert
true zurück, wenn der Puffer erfolgreich geleert wurde. Bei einem Fehler (z. B. ungültiger Handle oder nicht beschreibbarer Stream) wird false zurückgegeben.Beispiele
Puffer nach Schreiboperation sofort leeren
<?php
$handle = fopen('/tmp/ausgabe.txt', 'w');
if ($handle === false) {
die('Datei konnte nicht geöffnet werden.');
}
fwrite($handle, 'Erster Eintrag: ' . date('H:i:s') . PHP_EOL);
// Puffer sofort auf die Festplatte schreiben,
// damit andere Prozesse den Inhalt sofort lesen können
if (!fflush($handle)) {
echo 'Fehler beim Leeren des Puffers!';
}
fwrite($handle, 'Zweiter Eintrag: ' . date('H:i:s') . PHP_EOL);
fflush($handle);
fclose($handle);
echo 'Datei wurde geschrieben.';
Live-Logging in eine Log-Datei
<?php
$logHandle = fopen('/var/log/meinprozess.log', 'a');
if ($logHandle === false) {
die('Log-Datei konnte nicht geöffnet werden.');
}
$aufgaben = ['Verbindung aufbauen', 'Daten laden', 'Verarbeiten', 'Abschluss'];
foreach ($aufgaben as $aufgabe) {
$zeile = '[' . date('Y-m-d H:i:s') . '] ' . $aufgabe . PHP_EOL;
fwrite($logHandle, $zeile);
// Sofort auf Festplatte schreiben, auch wenn der Prozess abstürzt
fflush($logHandle);
// Simulierter Aufwand
usleep(100000);
}
fclose($logHandle);
echo 'Logging abgeschlossen.';
// Wichtig · Fallstricke
Wichtig: fflush() leert nur den Puffer der C-Standardbibliothek (libc). Das Betriebssystem selbst kann die Daten noch im Kernel-Buffer-Cache halten. Um sicherzustellen, dass die Daten tatsächlich physisch auf dem Speichermedium persistiert werden (z. B. vor einem Systemabsturz), muss zusätzlich fsync() aufgerufen werden.
Bei Netzwerk-Streams oder Sockets hat fflush() möglicherweise keine Wirkung, da diese eigene Puffermechanismen verwenden. Für Output-Buffering auf HTTP-Ebene ist stattdessen ob_flush() bzw. flush() zu verwenden.
Auf schreibgeschützten Streams (geöffnet mit Modus 'r') hat fflush() keine Wirkung, gibt aber dennoch true zurück.