W3docs

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:

  1. $stream: El puntero de archivo que deseas cerrar. Debe ser un recurso válido y abierto devuelto por fopen(), fsockopen(), popen(), o una función similar. Pasar un recurso inválido o ya cerrado provoca un TypeError (PHP 8+) o una advertencia (PHP 7), y la función devuelve false.

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 a fread(), fwrite() o fclose() sobre él de nuevo fallará.
  • Un fclose() por cada fopen(). Cerrar el mismo manejador dos veces provoca un error en la segunda llamada.
  • fclose() no elimina el archivo. Solo libera el puntero. Usa unlink() 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 que fclose() 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.

Práctica

Práctica
¿Cuál es el propósito de la función fclose() en PHP?
¿Cuál es el propósito de la función fclose() en PHP?
Was this page helpful?