Start · Sprachen · PHP · Referenz · fflush

fflush

Funktion

Leert den internen Schreibpuffer eines geöffneten Datei-Streams und schreibt alle gepufferten Daten physisch in die Datei.

seit PHP 4.0.1 Kategorie: io

Signatur

fflush(resource $handle): bool

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

Typ
bool
Beschreibung
Gibt 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.';
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.';
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.