W3docs

delete()

La fonction unlink() en PHP permet de supprimer un fichier. Indispensable pour gérer les fichiers sur le serveur en tant qu'administrateur ou développeur web.

PHP ne possède pas de fonction delete(). Pour supprimer un fichier du système de fichiers, on utilise unlink() — ce nom vient de l'appel système Unix sous-jacent, qui retire le nom d'un fichier (son « lien ») d'un répertoire. Lorsque le dernier lien est supprimé, les données du fichier sont libérées.

Cette page explique ce que fait unlink(), les pièges courants (fichier absent, permissions, chemins relatifs) et les fonctions associées à utiliser quand unlink() n'est pas l'outil approprié — comme rmdir() pour les répertoires et glob() pour supprimer plusieurs fichiers à la fois.

Supprimer un fichier (unlink()) n'est pas la même chose que supprimer des enregistrements de base de données — pour cela, on exécute une requête SQL DELETE, pas un appel système de fichiers.

Syntaxe

unlink(string $filename, ?resource $context = null): bool
  • $filename — le chemin vers le fichier à supprimer. Il peut être absolu (/var/www/data.txt) ou relatif au répertoire de travail du script (uploads/data.txt).
  • $context — (optionnel) un contexte de flux, utilisé uniquement avec des wrappers de flux tels que ftp://. Rarement nécessaire pour les fichiers locaux.

unlink() retourne true en cas de succès et false en cas d'échec. En cas d'échec, elle émet également un E_WARNING — par exemple lorsque le fichier n'existe pas ou que le processus n'a pas la permission de le supprimer.

Toujours vérifier le résultat

Un simple unlink("file.txt") laisse silencieusement un avertissement dans vos journaux si le fichier est absent. Vérifiez la valeur de retour et, lorsque le fichier peut ne pas exister, protégez-vous avec file_exists() pour éviter de déclencher un avertissement :

$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";
}

Exemples

Exemple 1 : Créer un fichier, puis le supprimer

Cet exemple autonome crée un fichier temporaire, confirme son existence, le supprime avec unlink(), puis confirme sa disparition :

$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";

Résultat :

Exists before delete? yes
Exists after delete?  no

Exemple 2 : Supprimer tous les fichiers correspondants avec glob()

unlink() supprime un fichier par appel. Pour effacer un ensemble de fichiers, combinez-la avec glob(), qui retourne un array de chemins correspondants :

foreach (glob("/tmp/cache/*.tmp") as $file) {
    unlink($file);
}

Cela supprime tous les fichiers .tmp dans /tmp/cache. Ce même schéma est la façon standard de « vider » un répertoire de ses fichiers avant de le supprimer avec rmdir() (qui ne fonctionne que sur les répertoires vides).

Exemple 3 : Supprimer un fichier via un wrapper de flux

unlink() fonctionne avec les wrappers de flux, y compris les distants. Le paramètre optionnel $context permet de passer des options spécifiques au wrapper :

$context = stream_context_create([
    'ftp' => ['overwrite' => true],
]);

unlink("ftp://example.com/old-export.txt", $context);

Pièges courants

  • Le fichier n'existe pas. unlink() retourne false et émet un avertissement. Utilisez file_exists() ou supprimez l'avertissement et vérifiez : @unlink($path).
  • Permissions. La suppression dépend de la permission d'écriture sur le répertoire parent, pas sur le fichier lui-même. Le processus PHP (souvent www-data) doit être propriétaire ou avoir un accès en écriture à ce répertoire.
  • Chemins relatifs. Un chemin relatif est résolu par rapport au répertoire de travail courant, qui n'est pas toujours le dossier du script. Préférez les chemins absolus ou construisez-les avec __DIR__.
  • C'est un répertoire. unlink() ne peut pas supprimer les répertoires — utilisez rmdir() pour un répertoire vide, et supprimez son contenu en premier.
  • Le fichier est ouvert. Sous Windows, supprimer un fichier encore ouvert par un descripteur échoue ; fermez-le d'abord. Sous Unix, l'unlink réussit mais les données persistent jusqu'à la fermeture du descripteur.

Fonctions associées

  • rmdir() — supprimer un répertoire vide.
  • file_exists() — vérifier si un chemin existe avant de le supprimer.
  • rename() — déplacer ou renommer un fichier au lieu de le supprimer.
  • copy() — copier un fichier avant de l'écraser ou de supprimer l'original.
  • glob() — lister les fichiers correspondant à un motif, puis les supprimer dans une boucle.

Conclusion

Utilisez unlink() pour supprimer un seul fichier, vérifiez toujours sa valeur de retour et protégez-vous avec file_exists() lorsque le fichier peut être absent. Pour les répertoires, utilisez rmdir(), et pour les suppressions en lot, associez unlink() à glob().

Pratique

Pratique
Quelle fonction supprime un seul fichier du système de fichiers en PHP ?
Quelle fonction supprime un seul fichier du système de fichiers en PHP ?
Was this page helpful?