delete()
La función unlink() en PHP elimina archivos del sistema. Aprende su sintaxis, errores comunes y funciones relacionadas.
Cómo eliminar un archivo en PHP con unlink()
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 SQLDELETE, 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 comoftp://. 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? noEjemplo 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()devuelvefalsey emite una advertencia. Usafile_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 — usarmdir()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().