Trabajo con el sistema de archivos en PHP: funciones principales y ejemplos
Trabajar con el sistema de archivos es una de las tareas clave del desarrollo web. PHP proporciona un conjunto potente y flexible de funciones para crear, leer, escribir, eliminar archivos y carpetas, así como para gestionar los permisos de acceso. En este artículo, analizaremos las principales capacidades de PHP para trabajar con el sistema de archivos, proporcionaremos ejemplos prácticos y consideraremos errores típicos.
1. Lectura de archivos en PHP
PHP admite varias formas de leer datos de archivos. La elección del método depende del tamaño del archivo y del nivel de control requerido.
1.1. Función file_get_contents()
La forma más sencilla de leer un archivo completo en una cadena es usar file_get_contents(). Esta función es adecuada para archivos pequeños (configuraciones, plantillas).
<?php// Lectura de todo el archivo en una cadena$content = file_get_contents('data.txt');if ($content !== false) { echo "Contenido del archivo: " . htmlspecialchars($content);} else { echo "Error al leer el archivo";}?>1.2. Función file()
Si necesita obtener el contenido del archivo como un array de líneas (una línea por elemento), use file().
<?php$lines = file('log.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);foreach ($lines as $lineNum => $line) { echo "Línea " . ($lineNum + 1) . ": " . htmlspecialchars($line) . "<br>";}?>1.3. Lectura línea por línea con fopen() + fgets()
Para archivos grandes (por ejemplo, registros), es mejor usar la lectura en flujo para no mantener todo el archivo en la memoria.
<?php$handle = fopen('large_file.csv', 'r');if ($handle) { while (($buffer = fgets($handle, 4096)) !== false) { echo $buffer . "<br>"; } fclose($handle);} else { echo "No se pudo abrir el archivo";}?>2. Escritura de datos en archivos
La escritura también se puede realizar de diferentes maneras. La principal diferencia es sobrescribir el archivo o agregar al final.
2.1. Función file_put_contents()
Una forma rápida de escribir una cadena en un archivo. Si el archivo no existe, se creará. Por defecto, el archivo se sobrescribe.
<?php$data = "Nuevo registro: " . date('Y-m-d H:i:s') . "";// Sobrescribir el archivofile_put_contents('log.txt', $data);// Agregar al final (bandera FILE_APPEND)file_put_contents('log.txt', $data, FILE_APPEND);?>2.2. Escritura manual a través de fopen() + fwrite()
Para un control preciso (por ejemplo, bloqueo de archivos), use el par fopen() / fwrite().
<?php$filename = 'counter.txt';$handle = fopen($filename, 'c+'); // 'c+' — crea el archivo si no existeif (flock($handle, LOCK_EX)) { // bloqueo exclusivo $current = (int) fread($handle, filesize($filename) ?: 1); $current++; ftruncate($handle, 0); // limpiamos el archivo rewind($handle); fwrite($handle, $current); flock($handle, LOCK_UN); // liberamos el bloqueo}fclose($handle);echo "Contador: $current";?>3. Trabajo con directorios
PHP no solo permite gestionar archivos, sino también crear, eliminar y explorar carpetas.
3.1. Creación de carpetas (mkdir)
<?php// Crear una carpetaif (!is_dir('uploads')) { mkdir('uploads', 0755);}// Creación recursiva de carpetas anidadas (PHP 5.4+)mkdir('images/2024/12', 0755, true);?>3.2. Eliminación de carpetas (rmdir)
rmdir() solo elimina una carpeta vacía. Para eliminar una carpeta con todo su contenido, se necesita una función recursiva.
<?phpfunction deleteDirectory($dir) { if (!file_exists($dir)) { return true; } if (!is_dir($dir)) { return unlink($dir); } $items = array_diff(scandir($dir), ['.', '..']); foreach ($items as $item) {