Sistema de archivos PHP
Aprende las funciones del sistema de archivos PHP para crear, leer, escribir y eliminar archivos y directorios en tus scripts.
Introducción
Las funciones del sistema de archivos de PHP permiten que tus scripts lean y escriban en el disco del servidor: creando, leyendo, actualizando y eliminando archivos, y gestionando directorios. Son la base de cualquier cosa que necesite persistir datos fuera de una base de datos: archivos de registro, informes generados, archivos subidos por usuarios, configuración, cachés y trabajos de importación/exportación.
Este artículo explica las dos formas principales de trabajar con archivos (la familia basada en manejadores construida alrededor de fopen(), y los helpers de un solo paso como file_get_contents()), muestra ejemplos ejecutables para cada una, y señala los problemas de permisos y manejo de errores que suelen causar dificultades en producción.
Dos formas de trabajar con archivos
PHP ofrece dos estilos, y elegir el correcto mantiene tu código simple:
- Helpers de un solo paso —
file_get_contents()yfile_put_contents()leen o escriben un archivo completo en una sola llamada. Úsalos cuando el archivo cabe cómodamente en memoria (archivos de configuración, JSON/CSV pequeños, plantillas). Son la opción más corta y legible. - Funciones basadas en manejadores —
fopen(),fread(),fwrite()yfclose()te dan un manejador de archivo (un recurso) que lees o escribes de forma incremental. Úsalos para archivos grandes que quieras transmitir línea a línea sin cargar todo en memoria, o cuando necesites mantener un archivo abierto durante muchas operaciones.
Operaciones con archivos
PHP proporciona varias funciones para trabajar con archivos. Estas funciones te permiten crear, abrir, leer, escribir y eliminar archivos. Las funciones de archivo más utilizadas incluyen:
fopen(): Abre un archivo y devuelve un manejador. Toma dos argumentos: el nombre del archivo y el modo en que abrirlo (ver la tabla más abajo).fclose(): Cierra un manejador de archivo abierto y vacía cualquier escritura en búfer al disco.fwrite(): Escribe una string en un archivo abierto, devolviendo el número de bytes escritos.fread(): Lee un número determinado de bytes desde un archivo abierto.feof(): Devuelvetrueuna vez que se ha llegado al final del archivo — útil como condición de bucle al leer.unlink(): Elimina un archivo.filesize(): Devuelve el tamaño de un archivo en bytes.file_exists(): Comprueba si existe un archivo o directorio antes de actuar sobre él.
Para tareas simples de lectura/escritura, prefiere file_get_contents() y file_put_contents(), que manejan la apertura, lectura/escritura y cierre en una sola llamada.
Modos de archivo para fopen()
El segundo argumento de fopen() controla qué puedes hacer con el manejador y qué ocurre con el contenido existente. Los modos más comunes son:
| Modo | Significado |
|---|---|
"r" | Solo lectura. El puntero comienza al inicio. Falla si el archivo no existe. |
"w" | Solo escritura. Trunca el archivo a longitud cero (o lo crea). |
"a" | Solo escritura, añadir. Crea el archivo si no existe; el contenido existente se conserva. |
"x" | Solo escritura, pero falla si el archivo ya existe — modo seguro de "crear nuevo". |
"r+" | Lectura y escritura. Puntero al inicio; el archivo debe existir. |
Atención:
"w"elimina el contenido existente en el momento en que abres el archivo. Si quieres añadir a un registro en lugar de sobreescribirlo, usa"a".
Operaciones con directorios
PHP también proporciona funciones para trabajar con directorios. Estas funciones te permiten crear, eliminar y manipular directorios. Algunas de las funciones de directorio más utilizadas incluyen:
mkdir(): Esta función se usa para crear un directorio.rmdir(): Esta función se usa para eliminar un directorio.opendir(): Esta función se usa para abrir un directorio.readdir(): Esta función se usa para leer el contenido de un directorio.closedir(): Esta función se usa para cerrar un directorio abierto.
Ejemplos
Veamos cómo se usan estas funciones en la práctica.
Crear y escribir un archivo
Para crear un archivo y escribir en él, ábrelo en modo escritura con fopen(), escribe con fwrite() y luego siempre cierra con fclose():
<?php
$file = fopen("example.txt", "w");
if ($file === false) {
exit("Error opening file");
}
fwrite($file, "Hello, world!");
fclose($file);Esto crea example.txt en el mismo directorio que el script (reemplazándolo si ya existe), escribe Hello, world! y cierra el manejador.
La misma tarea con el helper de un solo paso es una sola línea — este es el estilo preferido para archivos pequeños:
<?php
file_put_contents("example.txt", "Hello, world!");Leer un archivo
Para leer un archivo con un manejador, ábrelo en modo lectura y usa fread(). Pasar filesize() le indica a fread() cuántos bytes leer:
<?php
$file = fopen("example.txt", "r");
if ($file === false) {
exit("Error opening file");
}
echo fread($file, filesize("example.txt"));
fclose($file);Para archivos pequeños, file_get_contents() hace lo mismo en una sola llamada:
<?php
echo file_get_contents("example.txt");Leer un archivo línea por línea
Para archivos grandes, lee línea por línea con fgets() para no cargar todo el archivo en memoria. El bucle se ejecuta hasta que feof() informa el fin del archivo:
<?php
$file = fopen("example.txt", "r");
if ($file === false) {
exit("Error opening file");
}
while (!feof($file)) {
$line = fgets($file);
echo $line;
}
fclose($file);Añadir contenido a un archivo
Para agregar a un archivo sin borrar lo que ya está, ábrelo en modo añadir ("a"). Este es el modo correcto para registros:
<?php
$file = fopen("log.txt", "a");
fwrite($file, "New log entry\n");
fclose($file);Crear un directorio
Para crear un directorio, usa la función mkdir():
<?php
mkdir("example_directory");Esto crea un directorio llamado example_directory junto al script. Para crear directorios anidados en una sola llamada, pasa el modo y el indicador recursivo:
<?php
mkdir("parent/child/grandchild", 0755, true);Nota:
mkdir()requiere permiso de escritura en el directorio padre. El tercer argumento (true) habilita la creación recursiva de directorios intermedios.
Eliminar un archivo
Para eliminar un archivo, usa la función unlink():
<?php
if (file_exists("example.txt")) {
unlink("example.txt");
}Verificar con file_exists() primero evita una advertencia cuando el archivo ya no existe.
Buenas prácticas
- Cierra siempre los manejadores. Cada
fopen()debe ir acompañado defclose()para que las escrituras en búfer se vacíen y el recurso se libere. - Comprueba los valores de retorno.
fopen(),mkdir()yunlink()devuelvenfalseen caso de fallo — protégete contra ello en lugar de asumir el éxito. - Ten en cuenta los permisos. La mayoría de los errores de "permiso denegado" provienen de que el usuario del servidor web no es propietario del directorio de destino, no de tu código.
- Elige la herramienta adecuada. Recurre a
file_get_contents()/file_put_contents()para trabajar con archivos completos; usa la familiafopen()/fread()solo cuando necesites transmisión.
Conclusión
Las funciones del sistema de archivos proporcionan la base para la gestión de archivos y directorios en PHP. Al entender la diferencia entre los helpers de un solo paso y la transmisión basada en manejadores, elegir el modo correcto de fopen() y cerrar los manejadores de forma segura, puedes construir aplicaciones robustas que almacenen datos y configuración de manera confiable. Para profundizar más, explora Manejo de archivos PHP, Abrir/Leer archivos PHP y trabajo con directorios.