W3docs

unlink()

En PHP, la fonction unlink() permet de supprimer un fichier. Découvrez la syntaxe, la valeur de retour, les règles de permission et les pièges courants.

Introduction

La fonction PHP unlink() supprime un seul fichier du système de fichiers. Son nom provient de l'appel système Unix sous-jacent unlink, qui supprime un nom (un « lien ») pointant vers les données d'un fichier. Lorsque le dernier lien vers un fichier est supprimé, le fichier lui-même est libéré.

Ce chapitre couvre la syntaxe, la valeur de retour, les règles de permissions et — tout aussi important — les pièges à éviter : les avertissements silencieux, la suppression uniquement lorsqu'un fichier existe, et pourquoi unlink() ne peut pas supprimer des répertoires.

Syntaxe

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

Paramètres

  • $filename — le chemin vers le fichier à supprimer. Il peut être relatif au répertoire de travail actuel ou un chemin absolu.
  • $context (optionnel) — une ressource de contexte de flux, utilisée dans des cas avancés comme la suppression via un wrapper de flux (par ex. FTP). Vous en aurez rarement besoin.

Valeur de retour

  • true si le fichier a été supprimé avec succès.
  • false en cas d'échec — par exemple, le fichier n'existe pas, le chemin pointe vers un répertoire, ou le processus manque de permission. En cas d'échec, PHP émet également un E_WARNING.

unlink() est le pendant des fonctions qui créent des fichiers, comme fopen() et file_put_contents().

Un exemple de base

Vérifiez toujours la valeur de retour pour que votre script sache si la suppression a bien eu lieu :

<?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.";
}

Résultat :

File deleted successfully.

Supprimer uniquement si le fichier existe

Appeler unlink() sur un fichier inexistant renvoie false et déclenche un avertissement. Protégez l'appel avec file_exists() (ou is_file()) pour éviter des avertissements indésirables :

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

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

Si cache/report.tmp n'existe pas, cela affiche Nothing to remove. au lieu de déclencher un avertissement.

Gérer les échecs proprement

En production, vous voudrez souvent réagir à un échec de suppression plutôt que de provoquer une erreur. L'opérateur @ supprime l'avertissement, mais une approche plus propre est de vérifier le résultat et de le signaler vous-même :

<?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.";
    }
}

Permissions : qui peut supprimer un fichier

Une surprise courante : la permission de supprimer un fichier est contrôlée par le répertoire, pas par le fichier. Pour supprimer un fichier, le processus PHP (par ex. l'utilisateur du serveur web comme www-data) a besoin de la permission d'écriture et d'exécution sur le répertoire qui le contient — même si le fichier lui-même est en lecture seule. Si vous obtenez des erreurs « permission refusée », inspectez les permissions du répertoire parent, pas seulement celles du fichier.

Supprimer plusieurs fichiers

unlink() supprime un fichier à la fois. Pour supprimer plusieurs fichiers correspondant à un motif, combinez-le avec glob() :

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

glob() retourne un tableau de chemins correspondants (ou un tableau vide si aucun ne correspond), donc la boucle ne fait rien lorsqu'il n'y a rien à supprimer.

unlink() fonctionne uniquement sur les fichiers. Si vous lui passez un répertoire, il échoue et émet un avertissement. Pour supprimer un répertoire, utilisez rmdir() — et notez que rmdir() fonctionne uniquement sur un répertoire vide. Supprimer un répertoire non vide signifie d'abord supprimer son contenu (avec unlink() pour les fichiers et rmdir() pour les sous-répertoires), puis supprimer le répertoire lui-même.

Pièges courants

  • Le fichier doit exister. Un fichier manquant renvoie false et génère un avertissement. Vérifiez avec file_exists() au préalable.
  • C'est permanent. unlink() ne déplace pas le fichier vers une corbeille ; les données sont supprimées immédiatement.
  • Pas pour les répertoires. Utilisez rmdir() pour les répertoires.
  • Cache des stats. Après la suppression d'un fichier, PHP peut encore le signaler comme existant en raison du cache des stats. Appelez clearstatcache() si vous revérifiez le même chemin dans une boucle serrée.
  • Handles de fichiers ouverts. Sous Windows, vous ne pouvez pas supprimer un fichier encore ouvert ; fermez-le d'abord avec fclose(). Sous Unix, la suppression est autorisée, mais les données restent jusqu'à la fermeture du dernier handle.

Conclusion

unlink() est la façon simple qu'a PHP de supprimer un seul fichier, en renvoyant true en cas de succès et false (plus un avertissement) en cas d'échec. Les bonnes pratiques essentielles sont : vérifier si le fichier existe avant de le supprimer, toujours inspecter la valeur de retour, se rappeler que la permission de suppression dépend du répertoire, et utiliser rmdir() pour supprimer des répertoires. Pour une vue d'ensemble plus large de la lecture, de l'écriture et de la gestion des fichiers, consultez PHP File Handling.

Pratique

Pratique
Quelle est la fonction de 'unlink()' en PHP ?
Quelle est la fonction de 'unlink()' en PHP ?
Was this page helpful?