fclose()
La función fclose() en PHP cierra un puntero de archivo abierto. Es esencial para administradores de servidores y desarrolladores web que gestionan
Introducción a la función fclose() de PHP
La función fclose() cierra un puntero de archivo que fue abierto previamente con fopen(). Un puntero de archivo (también llamado manejador o recurso de flujo) es el valor que PHP te devuelve cuando abre un archivo; todas las operaciones de lectura y escritura lo utilizan para rastrear tu posición actual en el archivo.
Cerrar un manejador cuando has terminado importa por dos razones:
- Vacía el búfer de escritura. PHP y el sistema operativo no necesariamente escriben cada byte en disco de inmediato — mantienen los datos en un búfer por rendimiento.
fclose()fuerza que cualquier salida en búfer sea escrita, de modo que un archivo que olvidaste cerrar puede terminar sin sus últimos bytes. - Libera recursos del sistema. Cada archivo abierto consume un descriptor de archivo del sistema operativo. Un script de larga duración (o un bucle que abre archivos sin cerrarlos) puede agotar el límite de descriptores y comenzar a fallar con "Too many open files".
PHP cierra automáticamente todos los manejadores aún abiertos cuando el script termina, por lo que raramente perderás datos en un script corto. Pero aún deberías cerrar los manejadores explícitamente — especialmente en bucles y procesos de larga duración — para que los recursos se liberen lo antes posible.
Sintaxis
fclose(resource $stream): bool$stream— el puntero de archivo abierto que deseas cerrar.
Parámetros
La función fclose() acepta un parámetro obligatorio:
$stream: El puntero de archivo que deseas cerrar. Debe ser un recurso válido y abierto devuelto porfopen(),fsockopen(),popen(), o una función similar. Pasar un recurso inválido o ya cerrado provoca unTypeError(PHP 8+) o una advertencia (PHP 7), y la función devuelvefalse.
Valores de retorno
Devuelve true en caso de éxito o false en caso de error.
Ejemplos
Ejemplo 1: Abrir, escribir y cerrar un archivo
El patrón más común es abrir un archivo, trabajar con él y luego cerrarlo. Al cerrar se vacía el texto en búfer al disco:
Escribir en un archivo y cerrar el manejador
<?php
$handle = fopen("notes.txt", "w"); // open for writing (creates/empties the file)
fwrite($handle, "Hello, fclose!\n");
fclose($handle); // flush + release the handle
echo "File written and closed.";Salida:
File written and closed.Ejemplo 2: Verificar siempre que el archivo se abrió correctamente
fopen() devuelve false si el archivo no se puede abrir (archivo inexistente, sin permisos). Cerrar false es un error, así que comprueba el manejador primero:
Protegerse contra una apertura fallida
<?php
$handle = fopen("data.txt", "r");
if ($handle === false) {
echo "Could not open the file.";
} else {
// ... read from the file ...
fclose($handle);
echo "Done.";
}Ejemplo 3: Cerrar dentro de un bucle
Cuando procesas muchos archivos, cierra cada manejador en cuanto termines para que los descriptores no se acumulen:
Cerrar cada manejador dentro del bucle
<?php
$files = ["a.txt", "b.txt", "c.txt"];
foreach ($files as $name) {
$handle = fopen($name, "r");
if ($handle !== false) {
// ... process the file ...
fclose($handle); // closed before the next iteration opens another
}
}Ejemplo 4: Verificar el valor de retorno
En código donde un cierre fallido importa (por ejemplo, al escribir en un flujo de red), inspecciona el valor de retorno:
Manejar un cierre fallido
<?php
$handle = fopen("report.txt", "w");
fwrite($handle, "Generated report\n");
if (fclose($handle) === false) {
echo "Failed to close the file — data may not have been saved.";
} else {
echo "File saved successfully.";
}Errores comunes
- No uses un manejador después de cerrarlo. Una vez que
fclose()se ejecuta, el recurso es inválido; llamar afread(),fwrite()ofclose()sobre él de nuevo fallará. - Un
fclose()por cadafopen(). Cerrar el mismo manejador dos veces provoca un error en la segunda llamada. fclose()no elimina el archivo. Solo libera el puntero. Usaunlink()para eliminar un archivo del disco.- El cierre automático no es gratis. Depender del cierre automático al final del script de PHP está bien para scripts pequeños, pero un bucle que abre sin cerrar puede alcanzar el límite de descriptores de archivo del SO mucho antes de que el script termine.
Funciones relacionadas
fopen()— abre un archivo y obtiene el manejador quefclose()cierra posteriormente.fwrite()— escribe datos en un manejador abierto.fread()/fgets()— lee desde un manejador abierto.feof()— comprueba si has llegado al final del archivo.PHP File Handling— el panorama general del trabajo con archivos.
Conclusión
fclose() cierra un puntero de archivo abierto, vaciando cualquier escritura en búfer y liberando el recurso del sistema subyacente. Aunque PHP cierra los manejadores automáticamente cuando un script finaliza, cerrarlos explícitamente — especialmente dentro de bucles y scripts de larga duración — evita que se agoten los descriptores de archivo y garantiza que tus datos lleguen al disco. Empareja cada fopen() con un fclose(), y protégete contra una apertura fallida antes de leer, escribir o cerrar.