W3docs

rewind()

Apprenez à utiliser rewind() en PHP pour replacer le pointeur de fichier au début d'un fichier ouvert, avec syntaxe, exemples et pièges courants.

Introduction

Lorsque vous lisez un fichier en PHP, un pointeur de fichier interne suit votre position courante. Chaque lecture fait avancer le pointeur ; une fois que vous atteignez la fin du fichier, les lectures suivantes ne retournent rien. La fonction rewind() déplace ce pointeur vers l'octet 0 — tout au début — ce qui vous permet de lire le même fichier à nouveau sans le fermer et le rouvrir.

Cette page explique ce que fait rewind(), sa syntaxe et sa valeur de retour, quand l'utiliser, les pièges courants, ainsi que des exemples exécutables que vous pouvez adapter.

Ce qu'est le pointeur de fichier

Pensez au pointeur de fichier comme à un curseur à l'intérieur du fichier ouvert. Des fonctions comme fread(), fgets() et fgetcsv() lisent à partir de ce curseur puis le font avancer du nombre d'octets consommés. Vous pouvez inspecter le curseur avec ftell() et le déplacer vers une position arbitraire avec fseek().

rewind($handle) est le raccourci pratique pour « revenir au début » — il est équivalent à fseek($handle, 0).

Syntaxe

rewind(resource $handle): bool
  • $handle — une ressource de pointeur de fichier encore ouverte, généralement retournée par fopen(). Elle doit pointer vers un flux pouvant être repositionné.
  • Retourne true en cas de succès et false en cas d'échec.

Pourquoi et quand l'utiliser

Utilisez rewind() chaque fois que vous devez lire ou traiter le même fichier ouvert plusieurs fois au cours d'une même exécution de script :

  • Compter puis traiter. Premier passage pour compter les lignes ou valider, deuxième passage pour effectuer le travail réel.
  • Relire après une écriture. Après avoir écrit dans un fichier ouvert en mode lecture/écriture ('w+', 'r+', 'a+'), rembobinez avant de relire ce que vous avez écrit.
  • Flux en mémoire. Lorsque vous construisez du contenu dans un flux php://memory ou php://temp, rembobinez avant de le lire.

Si vous ne lisez un fichier qu'une seule fois, vous n'avez pas du tout besoin de rewind().

Exemples

Exemple 1 : Lire le même fichier deux fois

Cet exemple crée un fichier temporaire, le lit jusqu'à la fin, puis le rembobine et le lit à nouveau.

<?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);

Sortie :

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

Le premier fread() laisse le pointeur à l'octet 18 (la fin du fichier). Sans rewind(), une deuxième lecture retournerait une chaîne vide. Après le rembobinage, le pointeur est de retour à 0 et le contenu complet est à nouveau disponible.

Exemple 2 : Écrire, rembobiner, puis relire

Lorsqu'un flux est ouvert en écriture et en lecture, rewind() vous permet de vérifier ce que vous avez écrit.

<?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);

Sortie :

Hello, W3Docs!

Exemple 3 : Toujours vérifier la valeur de retour

rewind() retourne false lorsque le flux ne peut pas être repositionné (par exemple, un flux réseau ou un pipe non-cherchable).

<?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);

Sortie :

Pointer reset. Position: 0

Pièges courants

  • Le pointeur est déjà à la fin après la lecture. C'est précisément la raison d'être de rewind(). Si une deuxième lecture ne retourne rien, vous avez probablement oublié de rembobiner.
  • Mode ajout ('a' / 'a+'). Le rembobinage déplace le pointeur de lecture au début, mais en mode ajout, chaque fwrite() ajoute toujours à la fin du fichier quelle que soit la position du pointeur.
  • Flux non-cherchables. Les pipes, les sockets et certains flux HTTP ne peuvent pas être rembobinés ; rewind() retourne false. Vérifiez la valeur de retour lorsque la source pourrait ne pas être cherchable.
  • Handles fermés. Appeler rewind() sur un handle déjà passé à fclose() génère un avertissement. Rembobinez avant de fermer.

Fonctions associées

  • fseek() — déplace le pointeur vers n'importe quel décalage d'octet (rewind() est équivalent à fseek($handle, 0)).
  • ftell() — rapporte la position courante du pointeur.
  • fopen() — ouvre un fichier ou un flux et obtient le handle.
  • fread() / fgets() — lit à partir de la position courante.
  • fclose() — ferme le handle lorsque vous avez terminé.

Conclusion

rewind() remet à zéro le pointeur interne d'un fichier ouvert pour que vous puissiez relire ou retraiter les données au cours d'une même exécution de script. C'est un simple raccourci pratique autour de fseek($handle, 0). N'oubliez pas de vérifier sa valeur de retour pour les flux non-cherchables, gardez en tête le comportement du mode ajout, et rembobinez avant de fermer le handle.

Pratique

Pratique
Quelle est la fonction de 'rewind()' en PHP ?
Quelle est la fonction de 'rewind()' en PHP ?
Was this page helpful?