fgets()
La función fgets() en PHP lee una línea desde un archivo abierto y la devuelve como string. Aprende su sintaxis, bucle de lectura y casos de uso.
La función fgets() lee una línea a la vez desde un manejador de archivo abierto. Es la forma estándar de procesar archivos de texto en PHP sin cargar el archivo completo en memoria — lo cual importa cuando un archivo es lo suficientemente grande como para que leerlo todo de una vez (con file_get_contents() o fread()) sería un desperdicio o directamente imposible.
Esta página cubre la sintaxis, lo que devuelve fgets(), el bucle de lectura correcto, errores comunes y cómo se relaciona con otras funciones de lectura de archivos.
¿Qué es la función fgets()?
fgets() lee desde la posición actual de un manejador de archivo abierto hasta incluir el siguiente carácter de nueva línea (\n), y devuelve ese texto como un string. Luego avanza el puntero del archivo para que la siguiente llamada lea la siguiente línea.
No está limitada a archivos en disco: cualquier flujo abierto con fopen() funciona, incluyendo php://stdin para leer entrada del teclado y URLs remotas.
Sintaxis
fgets(resource $stream, ?int $length = null): string|false$stream— un puntero de archivo devuelto porfopen()(u otra función de flujo). Debe seguir abierto.$length(opcional) — leer como máximo$length - 1bytes. La lectura se detiene cuando se alcanza una nueva línea, el fin del archivo, o cuando se han leído$length - 1bytes, lo que ocurra primero. Omítelo para leer hasta el final de la línea sin importar su longitud.
Qué devuelve fgets()
| Situación | Valor de retorno |
|---|---|
| Se leyó una línea | La línea como string, con el \n final incluido |
| Ya en el fin del archivo | false |
| Ocurrió un error | false |
Como el carácter de nueva línea se conserva, echo reproduce los saltos de línea del archivo. Si no los quieres, elimínalos con rtrim($line, "\r\n").
El hecho de que
fgets()devuelvafalseal final del archivo es lo que hace funcionar el bucle de lectura que se muestra a continuación — ni siquiera necesitasfeof().
Cómo usar fgets(): los tres pasos
- Abrir el archivo con
fopen()en un modo de lectura como"r". - Leer línea por línea con
fgets(). - Cerrar el manejador con
fclose()cuando hayas terminado.
El bucle de lectura recomendado
El patrón más limpio usa el valor de retorno false como condición del bucle. La asignación en PHP evalúa al valor asignado, por lo que while (($line = fgets($file)) !== false) lee una línea y la comprueba en un solo paso:
<?php
$file = fopen("file.txt", "r");
if ($file === false) {
exit("Could not open the file.\n");
}
while (($line = fgets($file)) !== false) {
echo $line; // newline is already part of $line
}
fclose($file);La comparación estricta !== false es importante: una línea que contiene solo "0" es "falsy" en PHP, por lo que un simple while ($line = fgets($file)) se detendría antes al llegar a esa línea. Siempre compara con !== false.
Leer línea por línea con feof()
También verás el bucle escrito con feof(), que devuelve true una vez que se ha alcanzado el fin del archivo:
<?php
$file = fopen("file.txt", "r");
while (!feof($file)) {
$line = fgets($file);
if ($line === false) {
break; // guard against a read failure mid-loop
}
echo $line;
}
fclose($file);Ambos estilos son correctos. La versión con !== false es generalmente preferida porque feof() solo se vuelve true después de que una lectura ha fallado, lo que puede causar una iteración extra vacía si no se tiene cuidado.
Limitar la longitud de la línea
Pasa $length para limitar cuánto de una línea larga lees a la vez. Aquí solo se devuelven los primeros 9 bytes ($length - 1) de cada fragmento:
<?php
$file = fopen("file.txt", "r");
// "Hello, world!" is read in pieces of at most 9 bytes
echo fgets($file, 10); // "Hello, wo"
echo "\n";
echo fgets($file, 10); // "rld!" (rest of the line)
fclose($file);Esto es útil para protegerse contra líneas excesivamente largas, pero para archivos de texto normales puedes omitir $length.
Leer entrada del usuario desde el terminal
Como fgets() funciona con cualquier flujo, es la forma clásica de leer una línea escrita por el usuario en la línea de comandos:
<?php
echo "What is your name? ";
$name = rtrim(fgets(STDIN), "\r\n"); // strip the Enter key's newline
echo "Hello, $name!\n";STDIN es una constante predefinida para php://stdin.
Errores comunes
- El carácter de nueva línea final está incluido. Usa
rtrim($line, "\r\n")al comparar o almacenar valores. - Comprueba con
!== false, no solo con veracidad, para que líneas como"0"o""no terminen el bucle antes de tiempo. fgets()necesita un manejador válido y abierto. Sifopen()devolviófalse(archivo no encontrado, permisos incorrectos), pasarlo afgets()genera una advertencia. Verifica el manejador primero.- No olvides
fclose(). PHP cierra los manejadores al finalizar el script, pero liberarlos explícitamente es una buena práctica, especialmente en scripts de larga duración. - Para lecturas de archivos completos, prefiere herramientas más simples. Si no necesitas control línea por línea,
file()devuelve el archivo como un array de líneas yfile_get_contents()lo devuelve como un string.
Funciones relacionadas
fopen()— abrir un archivo o flujo (necesario antes defgets()).fread()— leer un número fijo de bytes, no líneas.fgetc()— leer un único carácter.fgetcsv()— leer una línea y analizarla como CSV.feof()— comprobar el fin del archivo.fclose()— cerrar el manejador.
Conclusión
fgets() lee un archivo una línea a la vez, devolviendo cada línea (con la nueva línea incluida) hasta llegar al fin del archivo, donde devuelve false. Combínala con fopen() y fclose(), controla el bucle con una prueba estricta !== false, y recuerda usar rtrim() con la nueva línea cuando necesites el valor limpio. Para archivos muy grandes esto mantiene el uso de memoria estable, lo que convierte a fgets() en la opción preferida para leer texto en flujo en PHP.