Manejo de Archivos en PHP
PHP ofrece diversas formas de manipular archivos y carpetas en el servidor. En este artículo se explican las capacidades de manejo de archivos de PHP.
El manejo de archivos es una de las tareas más comunes en la programación del lado del servidor: escribir registros, generar informes, cachear datos, importar archivos CSV y servir descargas dependen de ello. PHP incluye un amplio conjunto de funciones integradas para trabajar con archivos, por lo que rara vez necesitarás una biblioteca externa.
Este capítulo cubre el ciclo de vida completo de un archivo — crear, leer, actualizar y eliminar (CRUD) — y explica cuándo usar cada enfoque. En términos generales, PHP te ofrece dos estilos:
- Funciones auxiliares para archivos completos (
file_get_contents(),file_put_contents()) — una sola línea, perfectas para archivos pequeños que puedes mantener en memoria. - Funciones basadas en flujos (
fopen(),fread(),fwrite(),fgets(),fclose()) — te proporcionan un manejador para leer o escribir un archivo grande por partes, sin cargarlo todo de una vez.
Saber cuál usar marca la diferencia entre código que funciona con un archivo de configuración de 2 KB y código que sobrevive a un archivo de registro de 2 GB.
Modos de Archivo
Cada llamada basada en flujos comienza con fopen($filename, $mode), y el modo es la parte que los principiantes suelen confundir más. Determina si el archivo se abre para lectura, escritura o ambas, si el contenido existente se borra y dónde comienza el puntero interno.
| Modo | Lectura | Escritura | Puntero | Si el archivo no existe | Contenido existente |
|---|---|---|---|---|---|
"r" | sí | no | inicio | advertencia, devuelve false | conservado |
"r+" | sí | sí | inicio | advertencia, devuelve false | conservado |
"w" | no | sí | inicio | creado | borrado (truncado) |
"w+" | sí | sí | inicio | creado | borrado (truncado) |
"a" | no | sí | fin | creado | conservado (añade al final) |
"a+" | sí | sí | fin | creado | conservado (añade al final) |
"x" | no | sí | inicio | creado | falla si el archivo ya existe |
Añade "b" (p. ej., "rb", "wb") para un acceso seguro en binario cuando trabajes con imágenes, PDFs o cualquier dato no textual — evita la traducción de finales de línea en Windows.
Crear y Escribir un Archivo
Para crear un archivo, ábrelo en un modo de escritura con fopen() y escribe en él con fwrite(). Cierra siempre el manejador con fclose() cuando termines — esto vacía el búfer al disco y libera el recurso.
<?php
$file = fopen("test.txt", "w"); // create/truncate, open for writing
fwrite($file, "Hello World\n");
fwrite($file, "Second line\n"); // each call appends after the previous one
fclose($file); // flush to disk and release the handleAbrir con "w" borra cualquier contenido existente. Para añadir a un archivo sin destruir lo que ya está allí, ábrelo en modo de adición ("a") en su lugar:
<?php
$log = fopen("app.log", "a"); // pointer starts at end of file
fwrite($log, "User logged in at " . date("H:i:s") . "\n");
fclose($log);Para una solución rápida en una sola línea cuando tienes toda la cadena en memoria, omite el manejador y usa file_put_contents():
<?php
file_put_contents("test.txt", "Hello World\n"); // overwrite
file_put_contents("app.log", "another line\n", FILE_APPEND); // appendComprueba siempre el valor de retorno de
fopen(). Si la ruta es incorrecta o el directorio no tiene permisos de escritura, devuelvefalsey PHP emite una advertencia — usarfalsecomo manejador fallará silenciosamente.
<?php
$file = fopen("/protected/test.txt", "w");
if ($file === false) {
die("Could not open the file for writing.");
}
fwrite($file, "data");
fclose($file);Leer un Archivo
La forma más sencilla de leer un archivo pequeño es file_get_contents(), que devuelve el contenido completo como una sola cadena:
<?php
$content = file_get_contents("test.txt");
echo $content; // prints everything in the fileCuando el archivo es grande, leerlo todo en memoria resulta ineficiente. Léelo línea por línea con fgets(), iterando hasta que feof() (fin de archivo) se alcance:
<?php
$file = fopen("test.txt", "r");
while (!feof($file)) {
$line = fgets($file); // reads one line, including the newline
echo $line;
}
fclose($file);Si quieres cada línea como un elemento de array en una sola llamada, file() es útil — pero, como file_get_contents(), carga todo el archivo en memoria:
<?php
$lines = file("test.txt"); // array, one element per line
echo "This file has " . count($lines) . " lines.";Un buen hábito es confirmar que un archivo existe antes de leerlo, usando file_exists() (o is_readable() para comprobar también los permisos):
<?php
if (file_exists("test.txt")) {
echo file_get_contents("test.txt");
} else {
echo "File not found.";
}Actualizar un Archivo
Para reemplazar el contenido de un archivo, la herramienta más limpia es file_put_contents(). Abre, escribe y cierra en una sola llamada:
<?php
$content = "Hello World Again\n";
file_put_contents("test.txt", $content); // replaces the old contentsPara añadir a un archivo en lugar de reemplazarlo, pasa el indicador FILE_APPEND (mostrado anteriormente) o ábrelo en modo de adición con fopen(). No existe una función "editar línea 3" — para cambiar parte de un archivo, normalmente lo lees, modificas los datos en PHP y los vuelves a escribir.
Eliminar un Archivo
Usa unlink() — nota el nombre poco habitual — para eliminar un archivo. Devuelve true si tiene éxito y false si falla, así que protégelo con file_exists() para evitar una advertencia:
<?php
if (file_exists("test.txt")) {
if (unlink("test.txt")) {
echo "File deleted.";
} else {
echo "Could not delete the file.";
}
} else {
echo "Nothing to delete.";
}unlink() solo elimina archivos. Para eliminar un directorio vacío usa rmdir(); consulta PHP Directory para trabajar con carpetas.
Cuándo Usar Cada Enfoque
- Archivos de texto/configuración pequeños, contenido completo de una vez →
file_get_contents()/file_put_contents(). - Archivos grandes, transmisión línea por línea →
fopen()+fgets()/fread(). - Añadir a un registro → modo
"a", oFILE_APPEND. - Crear un archivo solo si aún no existe → modo
"x". - Datos binarios (imágenes, PDFs) → añade el indicador
"b"y usafread()/fwrite().
Resumen
El manejo de archivos es una parte fundamental de PHP del lado del servidor. Aprendiste las dos familias de funciones — las funciones auxiliares para archivos completos en una línea y las funciones de manejador basadas en flujos — y cuándo es apropiada cada una, cómo los modos de archivo controlan el truncado y la adición, cómo leer archivos grandes de forma eficiente con fgets()/feof(), y cómo actualizar y eliminar archivos de forma segura.
Para profundizar, explora los capítulos dedicados: Crear y Escribir un Archivo, Abrir y Leer un Archivo, Funciones del Sistema de Archivos de PHP, Carga de Archivos y PHP Directory.