Apuntes php

PHP: Porque a veces necesitas un poco de caos en tu vida.

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() y file_put_contents() cuando sea posible.
  • Verifica siempre is_readable(), is_writable() y filesize().
  • 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.
TOP