W3docs

fopen()

La función fopen() de PHP abre un archivo o URL y devuelve un puntero de archivo para leer, escribir y cerrar el flujo.

¿Qué es la función fopen()?

La función fopen() es una función incorporada de PHP que abre un archivo (o una URL) y devuelve un puntero de archivo — un identificador de recurso que luego se pasa a funciones como fread(), fwrite(), fgets() y fclose() para leer, escribir y cerrar el flujo. En caso de error devuelve false y emite un E_WARNING.

Casi todas las operaciones de archivo en PHP que leen o escriben de forma incremental comienzan con fopen(). (Para lecturas y escrituras en un solo paso, generalmente se utilizan file_get_contents() y file_put_contents() — consulta Cuándo no usar fopen().)

Sintaxis

fopen(string $filename, string $mode, bool $use_include_path = false, $context = null): resource|false
ParámetroDescripción
$filenameRuta al archivo, o una URL (p. ej. https://…, php://stdin) cuando los envoltorios están habilitados.
$modeCómo abrir el archivo — lectura, escritura, adición, etc. Consulta la tabla a continuación.
$use_include_pathSi es true, PHP también busca el archivo en el include_path.
$contextUn contexto de flujo opcional creado con stream_context_create().

Devuelve un recurso puntero de archivo en caso de éxito, o false en caso de error.

Modos de fopen()

El argumento $mode es la parte que la gente suele usar incorrectamente. Controla si el archivo se lee, se escribe o ambas cosas, dónde comienza el puntero interno y si el archivo se trunca o debe existir previamente.

ModoLecturaEscrituraEl puntero comienza en¿Trunca?Si el archivo no existe
rnoinicionoadvertencia, devuelve false
r+inicionoadvertencia, devuelve false
wnoiniciolo crea
w+iniciolo crea
anofinalnolo crea
a+final (las escrituras siempre se añaden)nolo crea
xnoinicionolo crea; falla si ya existe
x+inicionolo crea; falla si ya existe

Puedes añadir b (binario, p. ej. 'rb') o t (texto) a cualquier modo. Usa siempre 'b' para archivos no textuales como imágenes o ejecutables — en Windows, el modo texto traduce silenciosamente los finales de línea y corrompe los datos binarios. En Unix ambos son idénticos, por lo que 'b' es el valor predeterminado seguro en todas partes.

Ejemplo básico: leer un archivo

Abre un archivo en modo lectura, lee su contenido y luego ciérralo. Comprueba siempre el valor de retorno antes de usar el identificador, y utiliza siempre fclose() cuando hayas terminado para que el sistema operativo pueda liberar el descriptor.

<?php

$filename = 'myfile.txt';
$file = fopen($filename, 'r');

if ($file === false) {
    echo "Unable to open file!";
} else {
    echo fread($file, filesize($filename));
    fclose($file);
}

Abrimos myfile.txt en modo de solo lectura y verificamos el identificador con una comparación estricta === false — esto es importante porque un recurso válido es verdadero, pero también lo son algunos valores que no son errores, por lo que las comprobaciones laxas pueden causarte problemas más adelante.

Escribir en un archivo

Abrir con 'w' crea el archivo si no existe y lo trunca a cero bytes si existe. Usa 'a' en su lugar cuando quieras añadir al final sin borrar lo que ya hay (muy útil para archivos de registro).

<?php

$file = fopen('log.txt', 'w');     // create / overwrite
fwrite($file, "First line\n");
fwrite($file, "Second line\n");
fclose($file);

$file = fopen('log.txt', 'a');     // append, keep existing content
fwrite($file, "Appended later\n");
fclose($file);

echo file_get_contents('log.txt');

Esto imprime las tres líneas porque 'a' añadió al archivo en lugar de reemplazarlo. Consulta fwrite() para la parte de escritura y feof() para detectar el final del archivo al iterar.

Leer línea por línea

Para archivos grandes, no leas todo en memoria de una sola vez. Combina fopen() con fgets() y feof() para procesar una línea a la vez:

<?php

$file = fopen('myfile.txt', 'r');
if ($file) {
    while (!feof($file)) {
        $line = fgets($file);
        if ($line !== false) {
            echo $line;
        }
    }
    fclose($file);
}

Errores comunes

  • Olvidar comprobar false. Si la ruta es incorrecta o los permisos deniegan el acceso, fopen() devuelve false y emite una advertencia. Llamar a fread() con false lanza un TypeError en PHP 8+.
  • No cerrar el identificador. Los descriptores abiertos son un recurso limitado; si se pierden en un proceso de larga duración, eventualmente se agota el límite del sistema operativo. Usa siempre fclose(), idealmente en un bloque finally.
  • Modo incorrecto. Usar 'w' cuando querías 'r' borra el archivo silenciosamente. Recurre a 'x' cuando específicamente quieras que la creación falle si el archivo ya existe.
  • Rutas relativas. Se resuelven según el directorio de trabajo actual del script, que no siempre es el que esperas. Prefiere rutas absolutas o __DIR__ . '/file.txt'.

Cuándo no usar fopen()

Si solo necesitas el archivo completo como string, o volcar un string a un archivo en una sola llamada, evita la danza de abrir/leer/cerrar:

ObjetivoFunción más sencilla
Leer un archivo completo como stringfile_get_contents()
Escribir un string en un archivo en una sola llamadafile_put_contents()
Leer un archivo en un array de líneasfile()
Enviar un archivo directamente a la salidareadfile()

Recurre a fopen() cuando necesites control fino e incremental — leer archivos enormes en fragmentos, añadir a un registro o trabajar con flujos que no son archivos como php://stdin.

Conclusión

fopen() es la base del manejo de archivos de bajo nivel en PHP: devuelve un puntero de archivo que lees con fread() / fgets(), escribes con fwrite() y siempre liberas con fclose(). Elige el modo correcto, verifica el valor de retorno y cierra el identificador, y el resto de las funciones de manejo de archivos de PHP se siguen de forma natural.

Práctica

Práctica
¿Qué hace la función 'fopen' de PHP según la URL mencionada?
¿Qué hace la función 'fopen' de PHP según la URL mencionada?
Was this page helpful?