W3docs

rewind()

Erfahren Sie, wie Sie die PHP-Funktion rewind() verwenden, um den Dateizeiger auf den Anfang einer geöffneten Datei zurückzusetzen – mit Syntax und Beispielen.

Einführung

Wenn Sie in PHP aus einer Datei lesen, verfolgt ein interner Dateizeiger Ihre aktuelle Position. Jeder Lesevorgang verschiebt den Zeiger nach vorne, sodass nach dem Erreichen des Dateiendes weitere Lesevorgänge nichts zurückgeben. Die Funktion rewind() verschiebt diesen Zeiger zurück auf Byte 0 — den absoluten Anfang — und ermöglicht es Ihnen, dieselbe Datei erneut zu lesen, ohne sie zu schließen und wieder zu öffnen.

Diese Seite erklärt, was rewind() tut, seine Syntax und seinen Rückgabewert, wann Sie es einsetzen sollten, welche häufigen Fallstricke es gibt und welche ausführbaren Beispiele Sie anpassen können.

Was der Dateizeiger ist

Stellen Sie sich den Dateizeiger als einen Cursor innerhalb der geöffneten Datei vor. Funktionen wie fread(), fgets() und fgetcsv() lesen ab diesem Cursor und verschieben ihn anschließend um die Anzahl der verbrauchten Bytes nach vorne. Sie können den Cursor mit ftell() abfragen und ihn mit fseek() an eine beliebige Position verschieben.

rewind($handle) ist die praktische Kurzschreibweise für „zurück zum Anfang springen" — es entspricht fseek($handle, 0).

Syntax

rewind(resource $handle): bool
  • $handle — eine noch geöffnete Datei-Zeiger-Ressource, die typischerweise von fopen() zurückgegeben wird. Sie muss auf einen Stream zeigen, der neu positioniert werden kann.
  • Gibt true bei Erfolg und false bei Fehler zurück.

Warum und wann Sie es verwenden sollten

Verwenden Sie rewind(), wenn Sie dieselbe geöffnete Datei mehr als einmal in einem einzigen Skriptdurchlauf lesen oder verarbeiten müssen:

  • Zählen und dann verarbeiten. Erster Durchlauf zum Zählen von Zeilen oder Validieren, zweiter Durchlauf für die eigentliche Arbeit.
  • Erneutes Lesen nach dem Schreiben. Nachdem Sie in eine Datei geschrieben haben, die im Lese-/Schreibmodus geöffnet wurde ('w+', 'r+', 'a+'), spulen Sie zurück, bevor Sie das Geschriebene zurücklesen.
  • In-Memory-Streams. Wenn Sie Inhalte in einem php://memory- oder php://temp-Stream aufbauen, spulen Sie zurück, bevor Sie ihn auslesen.

Wenn Sie eine Datei nur einmal lesen, benötigen Sie rewind() überhaupt nicht.

Beispiele

Beispiel 1: Dieselbe Datei zweimal lesen

Dieses Beispiel erstellt eine temporäre Datei, liest sie bis zum Ende, spult dann zurück und liest sie erneut.

<?php

// Create a temporary file we can read and write.
$handle = tmpfile();
fwrite($handle, "line one\nline two\n");

// Move to the start so we can read what we just wrote.
rewind($handle);

echo "First read:\n";
echo fread($handle, 1024);

// The pointer is now at the end; reading again gives nothing.
echo "After first read, position: " . ftell($handle) . "\n";

// Rewind and read the whole file again.
rewind($handle);
echo "Second read:\n";
echo fread($handle, 1024);

fclose($handle);

Ausgabe:

First read:
line one
line two
After first read, position: 18
Second read:
line one
line two

Das erste fread() lässt den Zeiger bei Byte 18 (dem Ende der Datei). Ohne rewind() würde ein zweiter Lesevorgang einen leeren string zurückgeben. Nach dem Zurückspulen befindet sich der Zeiger wieder bei 0 und der gesamte Inhalt ist erneut verfügbar.

Beispiel 2: Schreiben, zurückspulen und dann zurücklesen

Wenn ein Stream sowohl zum Schreiben als auch zum Lesen geöffnet ist, ermöglicht rewind() die Überprüfung des Geschriebenen.

<?php

// php://memory is an in-memory read/write stream.
$handle = fopen('php://memory', 'r+');

fwrite($handle, 'Hello, W3Docs!');

// Without rewind, the pointer sits after the written text,
// so reading now would return an empty string.
rewind($handle);

$content = stream_get_contents($handle);
echo $content; // Hello, W3Docs!

fclose($handle);

Ausgabe:

Hello, W3Docs!

Beispiel 3: Immer den Rückgabewert prüfen

rewind() gibt false zurück, wenn der Stream nicht neu positioniert werden kann (zum Beispiel ein nicht suchbarer Netzwerk- oder Pipe-Stream).

<?php

$handle = fopen('php://memory', 'r+');
fwrite($handle, 'data');

if (rewind($handle)) {
    echo "Pointer reset. Position: " . ftell($handle) . "\n";
} else {
    echo "This stream cannot be rewound.\n";
}

fclose($handle);

Ausgabe:

Pointer reset. Position: 0

Häufige Fallstricke

  • Der Zeiger befindet sich nach dem Lesen bereits am Ende. Das ist der eigentliche Grund, warum rewind() existiert. Wenn ein zweiter Lesevorgang nichts zurückgibt, haben Sie wahrscheinlich vergessen zurückzuspulen.
  • Anhängemodus ('a' / 'a+'). Das Zurückspulen verschiebt den Lese-Zeiger an den Anfang, aber im Anhängemodus hängt jedes fwrite() unabhängig von der Zeigerposition noch immer am Ende der Datei an.
  • Nicht suchbare Streams. Pipes, Sockets und einige HTTP-Streams können nicht zurückgespult werden; rewind() gibt false zurück. Prüfen Sie den Rückgabewert, wenn die Quelle möglicherweise nicht suchbar ist.
  • Geschlossene Handles. Das Aufrufen von rewind() auf einem Handle, das bereits an fclose() übergeben wurde, erzeugt eine Warnung. Spulen Sie zurück, bevor Sie schließen.

Verwandte Funktionen

  • fseek() — verschiebt den Zeiger an einen beliebigen Byte-Offset (rewind() entspricht fseek($handle, 0)).
  • ftell() — gibt die aktuelle Zeigerposition zurück.
  • fopen() — öffnet eine Datei oder einen Stream und gibt das Handle zurück.
  • fread() / fgets() — liest ab der aktuellen Position.
  • fclose() — schließt das Handle, wenn Sie fertig sind.

Fazit

rewind() setzt den internen Zeiger einer geöffneten Datei auf den Anfang zurück, sodass Sie die Daten im gleichen Skriptdurchlauf erneut lesen oder verarbeiten können. Es ist ein schlanker, praktischer Wrapper um fseek($handle, 0). Denken Sie daran, den Rückgabewert bei nicht suchbaren Streams zu prüfen, das Verhalten im Anhängemodus im Hinterkopf zu behalten und vor dem Schließen des Handles zurückzuspulen.

Übung

Übung
Was ist die Funktion von 'rewind()' in PHP?
Was ist die Funktion von 'rewind()' in PHP?
Was this page helpful?