W3docs

unlink()

La funzione unlink() in PHP elimina un file dal filesystem. Scopri sintassi, valore di ritorno, permessi e casi d'uso pratici.

Introduzione

La funzione PHP unlink() elimina un singolo file dal filesystem. Il nome deriva dalla chiamata di sistema Unix sottostante unlink, che rimuove un nome (un "link") che punta ai dati di un file. Quando viene rimosso l'ultimo link a un file, il file stesso viene liberato.

Questo capitolo tratta la sintassi, il valore di ritorno, le regole sui permessi e — altrettanto importante — le insidie: gli avvisi silenziati, l'eliminazione solo quando un file esiste e perché unlink() non può rimuovere le directory.

Sintassi

unlink(string $filename, ?resource $context = null): bool

Parametri

  • $filename — il percorso del file da eliminare. Può essere relativo alla directory di lavoro corrente o un percorso assoluto.
  • $context (opzionale) — una risorsa di contesto di stream, utilizzata per casi avanzati come l'eliminazione tramite un wrapper di stream (es. FTP). Raramente ne avrai bisogno.

Valore di ritorno

  • true se il file è stato eliminato con successo.
  • false se ha fallito — ad esempio, il file non esiste, il percorso punta a una directory, o il processo non ha i permessi necessari. In caso di errore PHP emette anche un E_WARNING.

unlink() è la controparte delle funzioni che creano file, come fopen() e file_put_contents().

Un esempio di base

Controlla sempre il valore di ritorno in modo che lo script sappia se l'eliminazione è avvenuta effettivamente:

<?php
// Create a file so we have something to delete.
file_put_contents('example.txt', 'temporary data');

if (unlink('example.txt')) {
    echo "File deleted successfully.";
} else {
    echo "Failed to delete the file.";
}

Output:

File deleted successfully.

Elimina solo se il file esiste

Chiamare unlink() su un file mancante restituisce false e genera un avviso. Proteggi la chiamata con file_exists() (o is_file()) per evitare avvisi rumorosi:

<?php
$path = 'cache/report.tmp';

if (file_exists($path)) {
    unlink($path);
    echo "Removed: {$path}";
} else {
    echo "Nothing to remove.";
}

Se cache/report.tmp non esiste, questo stampa Nothing to remove. invece di generare un avviso.

Gestire i fallimenti in modo pulito

In produzione spesso vuoi reagire a un'eliminazione fallita anziché andare in crash. L'operatore @ sopprime l'avviso, ma un approccio più pulito è controllare il risultato e segnalarlo tu stesso:

<?php
$path = 'logs/old.log';

if (!@unlink($path)) {
    // file_exists() distinguishes "already gone" from a real permission error.
    if (file_exists($path)) {
        echo "Could not delete {$path} — check permissions.";
    } else {
        echo "File was already gone.";
    }
}

Permessi: chi può eliminare un file

Una sorpresa comune: il permesso per eliminare un file è controllato dalla directory, non dal file. Per rimuovere un file, il processo PHP (es. l'utente del web server come www-data) ha bisogno del permesso di scrittura ed esecuzione sulla directory che lo contiene — anche se il file stesso è di sola lettura. Se ricevi errori "permission denied", ispeziona i permessi della directory padre, non solo quelli del file.

Eliminazione di molti file

unlink() rimuove un file alla volta. Per eliminare più file corrispondenti a un pattern, combinalo con glob():

<?php
// Delete every .tmp file in the cache directory.
foreach (glob('cache/*.tmp') as $file) {
    unlink($file);
}

glob() restituisce un array di percorsi corrispondenti (o un array vuoto se nessuno corrisponde), quindi il ciclo non fa semplicemente nulla quando non c'è niente da eliminare.

unlink() funziona solo sui file. Se gli passi una directory, fallisce e genera un avviso. Per rimuovere una directory, usa rmdir() — e nota che rmdir() funziona solo su una directory vuota. Rimuovere una directory non vuota significa eliminare prima il suo contenuto (con unlink() per i file e rmdir() per le sottodirectory), poi rimuovere la directory stessa.

Insidie comuni

  • Il file deve esistere. Un file mancante restituisce false e genera un avviso. Verifica prima con file_exists().
  • È permanente. unlink() non sposta il file nel cestino; i dati vengono eliminati immediatamente.
  • Non per le directory. Usa rmdir() per le directory.
  • Cache stat. Dopo aver eliminato un file, PHP potrebbe ancora segnalarlo come esistente a causa della cache stat. Chiama clearstatcache() se controlli nuovamente lo stesso percorso in un ciclo stretto.
  • Handle di file aperti. Su Windows non puoi eliminare un file ancora aperto; chiudilo prima con fclose(). Su Unix l'eliminazione è consentita, ma i dati rimangono fino alla chiusura dell'ultimo handle.

Conclusione

unlink() è il modo diretto di PHP per eliminare un singolo file, restituendo true in caso di successo e false (più un avviso) in caso di errore. Le pratiche fondamentali sono: verificare se il file esiste prima di eliminarlo, controllare sempre il valore di ritorno, ricordare che il permesso di eliminazione dipende dalla directory, e ricorrere a rmdir() quando è necessario rimuovere directory. Per un quadro più ampio sulla lettura, scrittura e gestione dei file, consulta PHP File Handling.

Pratica

Pratica
Qual è la funzione di 'unlink()' in PHP?
Qual è la funzione di 'unlink()' in PHP?
Was this page helpful?