rewind()
Apprenez comment rewind() de PHP remet le pointeur de fichier au début pour le relire. Syntaxe, valeur de retour, exemples et comparaison avec fseek().
Introduction
Lorsque vous ouvrez un fichier en PHP, le système maintient un pointeur de fichier — une position interne qui indique où se produira la prochaine lecture ou écriture. Chaque fois que vous lisez avec fgets() ou fread(), ce pointeur avance. La fonction rewind() ramène le pointeur tout au début du fichier (octet 0) afin que vous puissiez le relire depuis le début sans avoir à le fermer et à le rouvrir.
Ce chapitre explique ce que fait rewind(), sa syntaxe et sa valeur de retour, et quand l'utiliser à la place de fseek().
Syntaxe
rewind(resource $stream): bool$stream— un pointeur de fichier retourné parfopen()(ou une ressource de flux similaire). Le flux doit être valide et accessible par déplacement.- Retourne
trueen cas de succès etfalseen cas d'échec.
Appeler rewind($stream) est équivalent à fseek($stream, 0) : les deux déplacent le pointeur au début du fichier. Utilisez ftell() à tout moment pour lire la position actuelle du pointeur.
Remarque : Sur les flux ouverts en mode ajout (
'a'ou'a+'), le pointeur de lecture est déplacé au début, mais les écritures sont toujours ajoutées à la fin du fichier.
Exemple : relire un fichier depuis le début
Après avoir lu une partie d'un fichier, rewind() vous permet de recommencer depuis le début :
<?php
$handle = fopen('notes.txt', 'r');
// Read the first line — this advances the pointer
echo fgets($handle); // e.g. "First line"
echo 'Pointer is at: ' . ftell($handle); // a non-zero byte offset
// Send the pointer back to the beginning
rewind($handle);
echo 'After rewind: ' . ftell($handle); // 0
// Re-read the same first line
echo fgets($handle); // "First line" again
fclose($handle);Le premier fgets() lit une ligne et laisse le pointeur quelque part dans le fichier, si bien que ftell() signale un décalage non nul. Après rewind(), ftell() retourne 0, et la prochaine lecture recommence depuis le premier octet.
Quand utiliser rewind()
- Deux passages sur le même fichier. Par exemple, compter les lignes d'un fichier, puis boucler à nouveau pour les traiter — sans rouvrir le fichier.
- Réinitialiser après une écriture. Vous écrivez dans un flux temporaire, puis
rewind()et vous relisez ce que vous venez d'écrire. - Relire un flux dont vous n'avez qu'une poignée, comme
php://memoryouphp://temp.
Préférez fseek() lorsque vous devez sauter à un décalage arbitraire plutôt qu'au tout début. Pour les handles de répertoire, l'équivalent de réinitialisation est rewinddir().
Pièges courants
- Flux non accessibles par déplacement. Certains flux (sockets réseau, certains pipes) ne peuvent pas être rembobinés ;
rewind()retournefalse. Vérifiez toujours la valeur de retour si le flux pourrait ne pas être accessible par déplacement. - Confusion entre les pointeurs de lecture et d'écriture en mode ajout. En mode
'a'/'a+', le rembobinage ne permet pas d'écraser depuis le début — les nouvelles données sont toujours ajoutées à la fin. - Oublier que les lectures avancent toujours le pointeur.
rewind()ne fait que réinitialiser la position ; le prochainfgets()/fread()le déplacera à nouveau vers l'avant.
Conclusion
rewind() remet le pointeur de fichier au début du fichier pour que vous puissiez le relire depuis le début. Elle retourne true en cas de succès et false en cas d'échec, et se comporte comme fseek($stream, 0). Elle s'associe naturellement à fopen(), fgets(), ftell() et fseek() lorsque vous avez besoin d'effectuer plus d'un passage sur le même fichier ou flux.