delete()
La funzione unlink() in PHP elimina un file dal filesystem. Scopri come usarla correttamente con esempi pratici e casi comuni.
Come eliminare un file in PHP con unlink()
PHP non dispone di una funzione delete(). Per eliminare un file dal filesystem si usa unlink() — il nome deriva dalla chiamata di sistema Unix sottostante, che rimuove il nome di un file (il suo "link") da una directory. Quando l'ultimo link viene rimosso, i dati del file vengono liberati.
Questa pagina illustra cosa fa unlink(), le insidie più comuni (file mancanti, permessi, percorsi relativi) e le funzioni correlate da usare quando unlink() non è lo strumento giusto — come rmdir() per le directory e glob() per eliminare più file contemporaneamente.
Eliminare un file (
unlink()) non è la stessa cosa che eliminare record dal database — per quest'ultima operazione si esegue una query SQLDELETE, non una chiamata al filesystem.
Sintassi
unlink(string $filename, ?resource $context = null): bool$filename— il percorso del file da eliminare. Può essere assoluto (/var/www/data.txt) o relativo alla directory di lavoro dello script (uploads/data.txt).$context— (opzionale) un contesto di stream, usato solo con i wrapper di stream comeftp://. Raramente necessario per i file locali.
unlink() restituisce true in caso di successo e false in caso di errore. In caso di errore emette anche un E_WARNING — ad esempio quando il file non esiste o il processo non ha i permessi per rimuoverlo.
Verificare sempre il risultato
Un semplice unlink("file.txt") lascia silenziosamente un avviso nei log se il file è mancante. Controlla il valore restituito e, quando il file potrebbe non esistere, usa prima file_exists() per evitare di generare un avviso:
$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";
}Esempi
Esempio 1: Creare un file e poi eliminarlo
Questo esempio autonomo crea un file temporaneo, ne verifica l'esistenza, lo elimina con unlink() e conferma che è stato rimosso:
$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";Output:
Exists before delete? yes
Exists after delete? noEsempio 2: Eliminare tutti i file corrispondenti con glob()
unlink() elimina un file per ogni chiamata, quindi per rimuovere un insieme di file combinalo con glob(), che restituisce un array di percorsi corrispondenti:
foreach (glob("/tmp/cache/*.tmp") as $file) {
unlink($file);
}Questo rimuove tutti i file .tmp in /tmp/cache. Lo stesso schema è il modo standard per "svuotare" una directory di file prima di rimuovere la directory stessa con rmdir() (che funziona solo su directory vuote).
Esempio 3: Eliminare un file tramite un wrapper di stream
unlink() funziona con i wrapper di stream, inclusi quelli remoti. Il parametro opzionale $context permette di passare opzioni specifiche del wrapper:
$context = stream_context_create([
'ftp' => ['overwrite' => true],
]);
unlink("ftp://example.com/old-export.txt", $context);Insidie comuni
- Il file non esiste.
unlink()restituiscefalsee genera un avviso. Usafile_exists()oppure sopprimi e controlla:@unlink($path). - Permessi. L'eliminazione dipende dal permesso di scrittura sulla directory contenitore, non sul file stesso. Il processo PHP (spesso
www-data) deve essere proprietario o avere accesso in scrittura a quella directory. - Percorsi relativi. Un percorso relativo viene risolto rispetto alla directory di lavoro corrente, che non è sempre la cartella dello script. Preferisci i percorsi assoluti o costruiscili con
__DIR__. - È una directory.
unlink()non può rimuovere directory — usarmdir()per una directory vuota, ed elimina prima il suo contenuto. - Il file è aperto. Su Windows, l'eliminazione di un file ancora aperto da un handle fallisce; chiudilo prima. Su Unix l'unlink riesce ma i dati rimangono finché l'handle non viene chiuso.
Funzioni correlate
rmdir()— rimuove una directory vuota.file_exists()— verifica se un percorso esiste prima di eliminarlo.rename()— sposta o rinomina un file invece di eliminarlo.copy()— copia un file prima di sovrascrivere o rimuovere l'originale.glob()— elenca i file corrispondenti a un pattern, poi li elimina in un ciclo.
Conclusione
Usa unlink() per eliminare un singolo file, verifica sempre il valore restituito e usa file_exists() come guardia quando il file potrebbe essere assente. Per le directory usa rmdir(), e per le eliminazioni in batch combina unlink() con glob().