rewind()
Aprende a usar rewind() en PHP para reiniciar el puntero de archivo al inicio, con sintaxis, ejemplos y errores comunes a evitar.
Introducción
Cuando lees un archivo en PHP, un puntero de archivo interno lleva el seguimiento de tu posición actual. Cada lectura avanza el puntero, de modo que una vez que llegas al final del archivo, las lecturas posteriores no devuelven nada. La función rewind() mueve ese puntero de vuelta al byte 0 — el principio absoluto — permitiéndote leer el mismo archivo de nuevo sin necesidad de cerrarlo y volver a abrirlo.
Esta página explica qué hace rewind(), su sintaxis y valor de retorno, cuándo usarla, los errores comunes y ejemplos ejecutables que puedes adaptar.
Qué es el puntero de archivo
Piensa en el puntero de archivo como un cursor dentro del archivo abierto. Funciones como fread(), fgets() y fgetcsv() leen desde ese cursor y luego lo avanzan en el número de bytes consumidos. Puedes inspeccionar el cursor con ftell() y moverlo a una posición arbitraria con fseek().
rewind($handle) es el atajo conveniente para "volver al inicio" — es equivalente a fseek($handle, 0).
Sintaxis
rewind(resource $handle): bool$handle— un recurso de puntero de archivo que aún está abierto, típicamente devuelto porfopen(). Debe apuntar a un stream que pueda ser reposicionado.- Devuelve
trueen caso de éxito yfalseen caso de fallo.
Por qué y cuándo usarla
Usa rewind() siempre que necesites leer o procesar el mismo archivo abierto más de una vez en una sola ejecución del script:
- Contar y luego procesar. Primera pasada para contar líneas o validar, segunda pasada para el trabajo real.
- Releer después de escribir. Tras escribir en un archivo abierto en modo lectura/escritura (
'w+','r+','a+'), rebobina antes de leer lo que escribiste. - Streams en memoria. Cuando construyes contenido en un stream
php://memoryophp://temp, rebobina antes de leerlo.
Si solo lees un archivo una vez, no necesitas rewind() en absoluto.
Ejemplos
Ejemplo 1: Leer el mismo archivo dos veces
Este ejemplo crea un archivo temporal, lo lee hasta el final, luego rebobina y lo lee de nuevo.
<?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);Salida:
First read:
line one
line two
After first read, position: 18
Second read:
line one
line twoEl primer fread() deja el puntero en el byte 18 (el final del archivo). Sin rewind(), una segunda lectura devolvería una cadena vacía. Después de rebobinar, el puntero vuelve a 0 y el contenido completo está disponible de nuevo.
Ejemplo 2: Escribir, rebobinar y luego releer
Cuando un stream se abre tanto para escritura como para lectura, rewind() permite verificar lo que escribiste.
<?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);Salida:
Hello, W3Docs!Ejemplo 3: Verificar siempre el valor de retorno
rewind() devuelve false cuando el stream no puede ser reposicionado (por ejemplo, un stream de red o pipe no buscable).
<?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);Salida:
Pointer reset. Position: 0Errores comunes
- El puntero ya está al final después de leer. Esta es la razón de ser de
rewind(). Si una segunda lectura no devuelve nada, probablemente olvidaste rebobinar. - Modo append (
'a'/'a+'). Rebobinar mueve el puntero de lectura al inicio, pero en modo append cadafwrite()sigue añadiendo al final del archivo independientemente de la posición del puntero. - Streams no buscables. Los pipes, sockets y algunos streams HTTP no pueden ser rebobinados;
rewind()devuelvefalse. Verifica el valor de retorno cuando la fuente podría no ser buscable. - Recursos cerrados. Llamar a
rewind()en un recurso ya pasado afclose()genera una advertencia. Rebobina antes de cerrar.
Funciones relacionadas
fseek()— mueve el puntero a cualquier desplazamiento de bytes (rewind()esfseek($handle, 0)).ftell()— informa la posición actual del puntero.fopen()— abre un archivo o stream y obtiene el recurso.fread()/fgets()— lee desde la posición actual.fclose()— cierra el recurso cuando hayas terminado.
Conclusión
rewind() reinicia el puntero interno de un archivo abierto al principio para que puedas releer o reprocesar los datos en la misma ejecución del script. Es un envoltorio delgado y conveniente alrededor de fseek($handle, 0). Recuerda verificar su valor de retorno para streams no buscables, ten en cuenta el comportamiento del modo append, y rebobina antes de cerrar el recurso.