Manejo de ficheros en PHP
PHP permite trabajar con archivos fácilmente: leer datos, guardar información, crear logs, etc. Aquí exploramos las funciones más comunes y buenas prácticas para manejarlos de forma segura.
Abrir un archivo con fopen()
fopen()
abre un fichero y devuelve un manejador de archivo que usaremos con otras funciones:
<?php
$archivo = "datos.txt";
$manejador = fopen($archivo, "r");
if (!$manejador) {
echo "No se pudo abrir el archivo.";
}
?>
Modos de apertura
r
: Lectura. Falla si no existe.w
: Escritura. Crea o sobrescribe.a
: Escritura al final. Crea si no existe.x
: Escritura. Falla si ya existe.c
: Escritura. Crea si no existe, no borra contenido.
r+
: Lectura y escritura (no crea).w+
: Lectura y escritura. Crea y sobrescribe.a+
: Lectura y escritura al final.x+
: Lectura y escritura. Falla si ya existe.c+
: Lectura y escritura. Crea si no existe, conserva contenido.
Recomendado: comprobar permisos antes de abrir:
<?php
if (!is_readable($archivo)) {
echo "El archivo no se puede leer.";
}
?>
Leer archivos
1. Leer todo el contenido: con file_get_contents()
:
<?php
$contenido = file_get_contents("datos.txt");
if ($contenido === false) {
echo "Error al leer el archivo.";
} else {
echo $contenido;
}
?>
2. Leer línea a línea: con file()
:
<?php
$lineas = file("datos.txt");
foreach ($lineas as $linea) {
echo $linea;
}
?>
3. Leer manualmente con fopen + fgets:
<?php
$archivo = "datos.txt";
if (is_readable($archivo)) {
$fh = fopen($archivo, "r");
while (!feof($fh)) {
echo fgets($fh);
}
fclose($fh);
}
?>
Leer en bloque con fread()
Para leer un tamaño concreto de bytes:
<?php
$archivo = "datos.txt";
if (is_readable($archivo) && filesize($archivo) > 0) {
$fh = fopen($archivo, "r");
$contenido = fread($fh, filesize($archivo));
fclose($fh);
echo $contenido;
}
?>
Mostrar archivo con readfile()
Envía directamente el contenido al navegador:
<?php
readfile("manual.txt");
?>
Para imágenes:
<?php
header("Content-Type: image/jpeg");
readfile("foto.jpg");
?>
Escribir archivos
1. Escribir fácilmente: con file_put_contents()
:
<?php
file_put_contents("log.txt", "Nueva entrada\n", FILE_APPEND);
?>
- Por defecto sobrescribe.
- Usa
FILE_APPEND
para añadir al final. - También puedes usar
LOCK_EX
para bloquear mientras escribe.
2. Escribir manualmente con fopen + fwrite:
<?php
$archivo = "registro.txt";
if (is_writable($archivo)) {
$fh = fopen($archivo, "a");
if (flock($fh, LOCK_EX)) {
fwrite($fh, "Línea nueva\n");
flock($fh, LOCK_UN);
}
fclose($fh);
}
?>
Ejemplo completo: contador de visitas
<?php
$archivo = "contador.txt";
$visitas = 1;
if (file_exists($archivo) && is_readable($archivo)) {
$visitas = (int)file_get_contents($archivo);
}
$visitas++;
file_put_contents($archivo, $visitas, LOCK_EX);
echo "Visitas: $visitas";
?>
Evitar problemas de concurrencia con flock()
LOCK_SH
: Bloqueo compartido (lectura).LOCK_EX
: Exclusivo (escritura).LOCK_UN
: Libera el bloqueo.
Anexo: funciones clásicas para manejo de ficheros
Las siguientes funciones forman parte del conjunto clásico de PHP para trabajar con archivos. Aunque muchas siguen siendo perfectamente válidas —como fopen()
o fwrite()
cuando se necesita un control detallado—, en casos simples se pueden sustituir por funciones más modernas como file_get_contents()
o file_put_contents()
, que combinan varias operaciones en una sola llamada.
Función | Descripción | Alternativas modernas |
---|---|---|
fopen() |
Abre un archivo para lectura o escritura, según el modo indicado. | file_get_contents() o file_put_contents() para casos simples |
fread() |
Lee un número de bytes desde un archivo abierto. | file_get_contents() |
fgets() |
Lee una línea desde un archivo. | No tiene sustituto exacto, pero se puede usar file() para leer líneas en un array |
fwrite() |
Escribe datos en un archivo abierto. | file_put_contents() |
fclose() |
Cierra un archivo abierto. | Automatizado en funciones como file_get_contents() |
flock() |
Establece un bloqueo de archivo para evitar accesos simultáneos. | file_put_contents() soporta bloqueo con LOCK_EX |
feof() |
Comprueba si se ha llegado al final del archivo. | Sin equivalente directo en funciones modernas |
rewind() |
Rebobina el puntero del archivo al principio. | |
ftell() |
Devuelve la posición actual del puntero en el archivo. | |
fseek() |
Mueve el puntero a una posición específica dentro del archivo. |
Buenas prácticas
- Usa
file_get_contents()
yfile_put_contents()
cuando sea posible. - Verifica siempre
is_readable()
,is_writable()
yfilesize()
. - No abras archivos con
w
sin entender que borrarán el contenido. - Emplea
flock()
si varios procesos acceden al archivo. - Cierra los archivos abiertos con
fclose()
. - Para trabajo más robusto con ficheros grandes, prefiere lectura por bloques.