W3docs

delete()

La función unlink() en PHP elimina archivos del sistema. Aprende su sintaxis, errores comunes y funciones relacionadas.

PHP no tiene ninguna función delete(). Para eliminar un archivo del sistema de archivos se usa unlink() — el nombre proviene de la llamada al sistema Unix subyacente, que elimina el nombre de un archivo (su "enlace") de un directorio. Cuando se elimina el último enlace, los datos del archivo quedan liberados.

Esta página explica qué hace unlink(), los errores comunes que suelen surgir (archivos inexistentes, permisos, rutas relativas) y las funciones relacionadas a las que se recurre cuando unlink() no es la herramienta adecuada — como rmdir() para directorios y glob() para eliminar varios archivos a la vez.

Eliminar un archivo (unlink()) no es lo mismo que eliminar registros de base de datos — para esto último se ejecuta una consulta SQL DELETE, no una llamada al sistema de archivos.

Sintaxis

unlink(string $filename, ?resource $context = null): bool
  • $filename — la ruta al archivo que se desea eliminar. Puede ser absoluta (/var/www/data.txt) o relativa al directorio de trabajo del script (uploads/data.txt).
  • $context — (opcional) un contexto de flujo, usado únicamente con envoltorios de flujo como ftp://. Raramente se necesita para archivos locales.

unlink() devuelve true en caso de éxito y false en caso de fallo. Ante un fallo también emite un E_WARNING — por ejemplo, cuando el archivo no existe o el proceso no tiene permiso para eliminarlo.

Comprueba siempre el resultado

Un simple unlink("file.txt") dejará silenciosamente una advertencia en los registros si el archivo no existe. Comprueba el valor de retorno y, cuando el archivo pueda no existir, protégete con file_exists() primero para no provocar una advertencia:

$path = "report.txt";

if (file_exists($path)) {
    if (unlink($path)) {
        echo "Deleted $path\n";
    } else {
        echo "Could not delete $path (check permissions)\n";
    }
} else {
    echo "Nothing to delete: $path does not exist\n";
}

Ejemplos

Ejemplo 1: Crear un archivo y luego eliminarlo

Este ejemplo autocontenido crea un archivo temporal, confirma que existe, lo elimina con unlink() y confirma que ya no está:

$path = sys_get_temp_dir() . "/w3docs-demo.txt";

file_put_contents($path, "temporary data");
echo "Exists before delete? " . (file_exists($path) ? "yes" : "no") . "\n";

unlink($path);
echo "Exists after delete?  " . (file_exists($path) ? "yes" : "no") . "\n";

Salida:

Exists before delete? yes
Exists after delete?  no

Ejemplo 2: Eliminar todos los archivos coincidentes con glob()

unlink() elimina un archivo por llamada, así que para limpiar un conjunto de archivos combínalo con glob(), que devuelve un array de rutas coincidentes:

foreach (glob("/tmp/cache/*.tmp") as $file) {
    unlink($file);
}

Esto elimina todos los archivos .tmp de /tmp/cache. El mismo patrón es la forma estándar de "vaciar" un directorio de archivos antes de eliminar el directorio en sí con rmdir() (que solo funciona con directorios vacíos).

Ejemplo 3: Eliminar un archivo a través de un envoltorio de flujo

unlink() funciona con envoltorios de flujo, incluidos los remotos. El parámetro opcional $context permite pasar opciones específicas del envoltorio:

$context = stream_context_create([
    'ftp' => ['overwrite' => true],
]);

unlink("ftp://example.com/old-export.txt", $context);

Errores comunes

  • El archivo no existe. unlink() devuelve false y emite una advertencia. Usa file_exists() o suprime y comprueba: @unlink($path).
  • Permisos. La eliminación depende del permiso de escritura en el directorio contenedor, no en el archivo en sí. El proceso PHP (a menudo www-data) debe ser propietario o tener acceso de escritura a ese directorio.
  • Rutas relativas. Una ruta relativa se resuelve respecto al directorio de trabajo actual, que no siempre coincide con la carpeta del script. Prefiere rutas absolutas o constrúyelas con __DIR__.
  • Es un directorio. unlink() no puede eliminar directorios — usa rmdir() para un directorio vacío, y elimina su contenido primero.
  • El archivo está abierto. En Windows, eliminar un archivo que aún está abierto por un manejador falla; ciérralo primero. En Unix el unlink se realiza correctamente, pero los datos permanecen hasta que el manejador se cierra.

Funciones relacionadas

  • rmdir() — elimina un directorio vacío.
  • file_exists() — comprueba si una ruta existe antes de eliminarla.
  • rename() — mueve o renombra un archivo en lugar de eliminarlo.
  • copy() — copia un archivo antes de sobrescribir o eliminar el original.
  • glob() — lista archivos que coinciden con un patrón y los elimina en un bucle.

Conclusión

Usa unlink() para eliminar un único archivo, comprueba siempre su valor de retorno y protégete con file_exists() cuando el archivo pueda no existir. Para directorios recurre a rmdir(), y para eliminaciones en lote combina unlink() con glob().

Práctica

Práctica
¿Qué función elimina un único archivo del sistema de archivos en PHP?
¿Qué función elimina un único archivo del sistema de archivos en PHP?
Was this page helpful?