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.
Comment supprimer un fichier en PHP avec unlink()
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 SQLDELETE, 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 queftp://. 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? noExemple 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()retournefalseet émet un avertissement. Utilisezfile_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 — utilisezrmdir()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'
unlinkré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().