fwrite()
Die Funktion fwrite() ist eine eingebaute PHP-Funktion, die Daten in eine Datei schreibt, beginnend an der aktuellen Position des Dateizeigers.
Was ist die Funktion fwrite()?
fwrite() ist eine eingebaute PHP-Funktion, die einen string in eine geöffnete Datei schreibt. Das Schreiben beginnt an der aktuellen Position des Dateizeigers, der nach jedem Schreibvorgang um die Anzahl der geschriebenen Bytes vorgerückt wird. Dadurch werden aufeinanderfolgende Aufrufe aneinandergereiht, anstatt sich gegenseitig zu überschreiben. Es ist der standardmäßige Low-Level-Weg, um in PHP Dateien zu schreiben, und wird häufig auch als fputs() aliasiert (beide sind identisch).
Diese Seite behandelt die Syntax, das optionale Argument length, die Dateimodi, die steuern, wohin und wie Daten geschrieben werden, Rückgabewerte, Fehlerbehandlung und die alltäglichen Aufgaben, für die fwrite() verwendet wird.
Syntax
fwrite(resource $stream, string $data, ?int $length = null): int|false| Parameter | Erforderlich | Beschreibung |
|---|---|---|
$stream | Ja | Ein Dateizeiger (resource), der von fopen() zurückgegeben wird. |
$data | Ja | Der zu schreibende string. |
$length | Nein | Falls angegeben, wird das Schreiben nach $length Bytes beendet – je nachdem, was zuerst eintrifft: das Ende von $data oder diese Grenze. |
Rückgabewert: die tatsächlich geschriebene Anzahl von Bytes oder false bei einem Fehler. Da bei manchen Streams ein kurzer Schreibvorgang (weniger Bytes als strlen($data)) möglich ist, prüft robuster Code den Rückgabewert, anstatt den Erfolg vorauszusetzen.
Das Argument
lengthwird fast nie benötigt.fwrite($file, $data)schreibt bereits den gesamten string. Übergeben Sie eine Länge nur dann, wenn Sie die Ausgabe bewusst auf die ersten N Bytes kürzen möchten.
Ein einfaches Beispiel
<?php
$filename = 'myfile.txt';
$file = fopen($filename, 'w'); // open for writing (truncates the file)
if ($file === false) {
exit("Could not open $filename for writing");
}
$bytes = fwrite($file, "Hello, world!");
fclose($file);
echo "Wrote $bytes bytes."; // Wrote 13 bytes.Dabei sind immer drei Schritte beteiligt:
- Öffnen Sie die Datei mit
fopen()in einem Modus, der das Schreiben erlaubt. - Rufen Sie
fwrite()ein oder mehrere Male auf, um Daten in den Stream zu übertragen. - Schließen Sie die Datei mit
fclose(), um den Puffer zu leeren und den Handle freizugeben.
"Hello, world!" besteht aus 13 Zeichen, daher gibt fwrite() den Wert 13 zurück.
Dateimodi: Wohin die Bytes gehen
Das Verhalten von fwrite() wird fast ausschließlich durch den Modus bestimmt, der an fopen() übergeben wurde. Dies ist die häufigste Quelle von Verwirrung, daher lohnt es sich, diese Modi auswendig zu lernen:
| Modus | Bedeutung | Vorhandener Inhalt |
|---|---|---|
'w' | Nur schreiben | Wird auf leer geleert, dann vom Anfang an beschrieben |
'w+' | Lesen + Schreiben | Geleert, dann beschrieben |
'a' | Nur anhängen | Beibehalten; jeder Schreibvorgang geht ans Ende |
'a+' | Lesen + Anhängen | Beibehalten; Schreibvorgänge gehen ans Ende |
'x' | Exklusives Schreiben | Schlägt fehl, wenn die Datei bereits existiert (verhindert Überschreiben) |
'r+' | Lesen + Schreiben | Beibehalten; Schreibvorgänge beginnen am Anfang und überschreiben Byte für Byte |
Wenn Ihre Datei immer wieder leer wird oder die Daten vom Vortag verloren gehen, haben Sie sie höchstwahrscheinlich mit 'w' geöffnet, obwohl Sie 'a' gemeint haben.
Anhängen statt Überschreiben
<?php
$log = fopen('app.log', 'a'); // 'a' keeps existing lines
fwrite($log, "User logged in\n"); // \n adds a newline
fwrite($log, "Order placed\n");
fclose($log);Jeder Durchlauf dieses Skripts fügt zwei weitere Zeilen zu app.log hinzu, anstatt die Datei zu leeren.
Mehrere Zeilen schreiben
fwrite() schreibt genau die Bytes, die übergeben werden – Zeilenumbrüche werden nicht automatisch hinzugefügt. Fügen Sie \n selbst ein (innerhalb doppelter Anführungszeichen, damit die Escape-Sequenz interpretiert wird):
<?php
$file = fopen('names.txt', 'w');
$names = ['Alice', 'Bob', 'Carol'];
foreach ($names as $name) {
fwrite($file, $name . PHP_EOL); // PHP_EOL = OS-correct line ending
}
fclose($file);PHP_EOL wird auf Unix/macOS zu \n und auf Windows zu \r\n aufgelöst, was Textdateien portabel hält.
Den Rückgabewert immer prüfen
Volle Festplatten, Berechtigungsprobleme und unterbrochene Pipes führen dazu, dass Schreibvorgänge fehlschlagen oder unvollständig bleiben. Behandeln Sie den Rückgabewert als zuverlässige Informationsquelle:
<?php
$file = fopen('report.txt', 'w');
if ($file === false) {
throw new RuntimeException('Unable to open report.txt');
}
$data = str_repeat('x', 1000);
$written = fwrite($file, $data);
if ($written === false || $written < strlen($data)) {
fclose($file);
throw new RuntimeException('Write failed or incomplete');
}
fclose($file);
echo "OK: $written bytes written";fwrite() vs. file_put_contents()
Für einen einzelnen, einmaligen Schreibvorgang ist file_put_contents() kürzer – sie öffnet, schreibt und schließt in einem einzigen Aufruf:
<?php
// Equivalent of the basic example above, in one line:
file_put_contents('myfile.txt', 'Hello, world!');Bevorzugen Sie fwrite(), wenn Sie die Datei über viele Schreibvorgänge hinweg geöffnet halten müssen (Schleifen, Streaming, Logging), Optionen wie Sperren übergeben möchten oder inkrementell schreiben wollen, ohne den gesamten string im Speicher neu aufzubauen.
Häufige Fallstricke
'w'leert sofort – in dem Moment, in demfopen($f, 'w')erfolgreich ist, ist der alte Inhalt weg, auch wenn Siefwrite()nie aufrufen.- Keine automatischen Zeilenumbrüche – Sie müssen
\n/PHP_EOLselbst hinzufügen. fclose()vergessen – Daten können in einem Puffer verbleiben und den Datenträger erst erreichen, wenn der Handle geschlossen wird (oder das Skript endet).- Einfache Anführungszeichen expandieren keine Escape-Sequenzen –
'Line\n'schreibt einen wörtlichen Backslash-n. Verwenden Sie"Line\n"für einen echten Zeilenumbruch. - Die
length-Grenze gilt in Bytes – bei mehrbyte-kodierten UTF-8-Texten kann eine Byte-Grenze ein Zeichen in der Mitte trennen.
Fazit
fwrite() ist PHPs Kernfunktion zum Schreiben von Strings in eine geöffnete Datei. Beherrschen Sie den dreistufigen Zyklus Öffnen–Schreiben–Schließen, wählen Sie den richtigen fopen()-Modus ('w' zum Ersetzen, 'a' zum Anhängen), fügen Sie eigene Zeilenumbrüche hinzu und prüfen Sie den Rückgabewert – dann können Sie alles von einfachen Textdateien bis hin zu dauerhaften Anwendungsprotokollen schreiben.
Verwandte Funktionen
fopen()— die Datei vor dem Schreiben öffnenfclose()— den Handle anschließend leeren und schließenfread()undfgets()— die Daten zurücklesenfile_put_contents()— eine ganze Datei in einem Aufruf schreibenfeof()— das Ende einer Datei beim Lesen erkennen