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ámetro | Descripción |
|---|---|
$filename | Ruta al archivo, o una URL (p. ej. https://…, php://stdin) cuando los envoltorios están habilitados. |
$mode | Cómo abrir el archivo — lectura, escritura, adición, etc. Consulta la tabla a continuación. |
$use_include_path | Si es true, PHP también busca el archivo en el include_path. |
$context | Un 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.
| Modo | Lectura | Escritura | El puntero comienza en | ¿Trunca? | Si el archivo no existe |
|---|---|---|---|---|---|
r | sí | no | inicio | no | advertencia, devuelve false |
r+ | sí | sí | inicio | no | advertencia, devuelve false |
w | no | sí | inicio | sí | lo crea |
w+ | sí | sí | inicio | sí | lo crea |
a | no | sí | final | no | lo crea |
a+ | sí | sí | final (las escrituras siempre se añaden) | no | lo crea |
x | no | sí | inicio | no | lo crea; falla si ya existe |
x+ | sí | sí | inicio | no | lo 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()devuelvefalsey emite una advertencia. Llamar afread()confalselanza unTypeErroren 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 bloquefinally. - 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:
| Objetivo | Función más sencilla |
|---|---|
| Leer un archivo completo como string | file_get_contents() |
| Escribir un string en un archivo en una sola llamada | file_put_contents() |
| Leer un archivo en un array de líneas | file() |
| Enviar un archivo directamente a la salida | readfile() |
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.