W3docs

delete()

La funzione unlink() in PHP elimina un file dal filesystem. Scopri come usarla correttamente con esempi pratici e casi comuni.

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 SQL DELETE, 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 come ftp://. 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?  no

Esempio 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() restituisce false e genera un avviso. Usa file_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 — usa rmdir() 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().

Esercizio

Pratica
Quale funzione elimina un singolo file dal filesystem in PHP?
Quale funzione elimina un singolo file dal filesystem in PHP?
Was this page helpful?