Grâce à ce tuto, vous apprendrez à supprimer automatiquement les fichiers stockés sur votre serveur. Par « automatiquement », j'entends le fait que l'on ne passe pas par le serveur, mais par une page PHP sur le Web ! De même, vous aurez la possibilité de choisir des critères de suppression pour ne supprimer que les fichiers voulus. Cela peut s'avérer utile lorsque l'on veut effacer des fichiers temporaires ou encore des fichiers uploadés intempestifs :) .
Pour mener à bien ce tuto, nous aurons besoin des fonctions de fichiers (file et dir). Il n'est pas nécessaire de connaître le tuto sur les fichiers de PHP pour arriver au script final. Je vous conseille cependant d'y jeter un coup d'œil pour comprendre ce que sont les fonctions file, ou encore de vous référer au site php.net.
La fonction en question se nomme unlink.
Elle est suivie d'un paramètre qui est… le fichier que l'on va supprimer. :p
Ce qui nous donne :
<?php unlink("fichier"); ?>
Ici, on renseignera le paramètre « fichier » par le chemin relatif de celui-ci, c'est-à-dire en partant de la racine du serveur.
Prenons un exemple concret. J'ai un fichier nommé toto.jpg dans le répertoire images/jpeg/ de mon serveur. Le chemin absolu est http://monsite.ext/images/jpeg/toto.jpg. Le chemin relatif sera donc : images/jpeg/toto.jpg.
Dans notre code PHP, on obtient donc ceci :
<?php unlink ("images/jpeg/toto.jpg"); ?>
Voilà pour la présentation de notre fonction qui effacera les fichiers. Bien sûr, on ne s'arrêtera pas là, puisque répéter l'opération pour chaque fichier serait fastidieux. On combinera donc cette fonction à une boucle ainsi qu'à des variables (étant donné qu'on ne connaît pas forcément le nom du fichier à supprimer… ;) ).
Tout comme PHP, qui doit se connecter à MySQL avant de donner des instructions, unlink ne peut fonctionner que si le répertoire que l'on va traiter a été précédemment ouvert.
Dans cette partie, nous allons apprendre à nous servir correctement des fonctions dir. Il en existe de nombreuses, mais celles que nous utiliserons sont les principales. Elles servent en effet à ouvrir un répertoire, à lire les fichiers contenus dans ce répertoire, puis à le fermer.
Comment ouvrir et fermer un répertoire ?
Les fonctions correspondantes sont opendir et closedir (très recherché, n'est-ce pas ? ^^ ). Elles sont composées de deux paramètres mais nous nous pencherons seulement sur le premier, que voici :
<?php
// J'ai gardé le même exemple que précédemment.
$ouverture = opendir ("images/jpeg"); // On ouvre le dossier (dans une variable qui sera utilisée par la suite).
// Ici seront données les instructions.
closedir ($ouverture); // On ferme le dossier.
Vous l'aurez compris, le paramètre en question est le chemin du répertoire auquel on se connecte. Jusqu'ici, tout paraît logique : on ouvre le dossier avec opendir grâce à son chemin relatif, on supprime le fichier avec unlink grâce à son chemin relatif. :)
Maintenant, comment lire dans ce répertoire ?
On va utiliser pour cela la fonction readdir de PHP. Grâce à readdir, nous allons lire le contenu du répertoire que nous avons ouvert. On va donc se servir de variables pour stocker les informations « d'ouverture » du répertoire. Mais un exemple vaut bien mieux qu'un long discours, voici donc le code :
<?php
$ouverture = opendir("images/jpeg");
// Maintenant que le répertoire est ouvert, on le lit :
$lecture = readdir($ouverture);
// On peut afficher $lecture, PHP retournera le premier fichier rencontré dans le répertoire jpeg, ici notre fichier toto.jpg.
closedir($ouverture); // On n'oublie pas de fermer ce qu'on a ouvert. ;-}
Vous êtes maintenant en mesure de créer vous-mêmes un script capable de supprimer tous les fichiers d'un dossier. Correction dans la partie suivante. ;o)
Maintenant que vous vous êtes familiarisés avec les fonctions de fichiers, nous allons accélérer les choses en combinant ce que vous avez appris et ce que vous savez déjà. Nous allons nous servir d'une boucle pour effacer entièrement le contenu d'un répertoire.
Mais, comment effacer un répertoire de 5 000 fichiers ? On va pas taper tout les noms, quand même ?! o_O
Non, pas du tout. On va effacer le contenu d'un répertoire dont les noms de fichiers n'ont pas besoin d'être connus. ^^ En effet, on veut tout effacer, on va donc demander à PHP de tout effacer, sans se préoccuper des noms . ;)
Voici le code, annoté de commentaires :
<?php
$dossier_traite = "images/jpeg";
$repertoire = opendir($dossier_traite); // On définit le répertoire dans lequel on souhaite travailler.
while (false !== ($fichier = readdir($repertoire))) // On lit chaque fichier du répertoire dans la boucle.
{
$chemin = $dossier_traite."/".$fichier; // On définit le chemin du fichier à effacer.
// Si le fichier n'est pas un répertoire…
if ($fichier != ".." AND $fichier != "." AND !is_dir($fichier))
{
unlink($chemin); // On efface.
}
}
closedir($repertoire); // Ne pas oublier de fermer le dossier ***EN DEHORS de la boucle*** ! Ce qui évitera à PHP beaucoup de calculs et des problèmes liés à l'ouverture du dossier.
Comme vous le voyez dans cet exemple, gérer les répertoires, fichiers et chemins qui vont avec requiert de l'organisation. J'ai donc utilisé plusieurs variables, ce qui permet d'une part d'avoir un script propre, et d'autre part de personnaliser entièrement celui-ci, évitant ainsi de réécrire tout le code en cas de changement de répertoire. On verra par la suite que cette organisation se révèle très utile pour créer une fonction entièrement paramétrable. ;)
J'ai utilisé une concaténation dans la variable $chemin. Prenez garde à ne pas oublier le « / » entre le nom de dossier et celui du fichier. En ce qui concerne la condition, j'ai exclu de la suppression tous les noms de fichiers qui seraient « .. » ou « . » et les dossiers, avec la fonction is_dir (est_dossier).
Notre petit script va supprimer tous les fichiers du répertoire jpeg/. Mais maintenant, je fais comment si je veux supprimer seulement les images, ou si je veux supprimer les fichiers trop âgés ? C'est ce sur quoi portera la prochaine partie. :magicien:
Voici la dernière partie de ce tuto. C'est donc la plus importante puisque l'on va réutiliser tout ce que l'on a vu précédemment. Notre but est de créer une fonction qui sera capable de supprimer automatiquement les fichiers dont l'extension et l'âge ont été choisis. Pour associer ces critères à notre fonction, nous allons avoir besoin de quelques outils que PHP a prédéfinis.
Liste des outils nécessaires à la réalisation de notre fonction :
toutes les étapes vues ci-dessus ; :D
la fonction pathinfo, qui retourne 3 informations sur un fichier dans un tableau associatif. À savoir, le chemin relatif du dossier contenant le fichier, le nom du fichier, et enfin, ce dont nous avons besoin : l'extension de ce fichier. Nous verrons comment l'utiliser dans notre cas.
La fonction filemtime, qui retourne le timestamp de la dernière modification d'un fichier. Elle est très simple à utiliser puisque nous aurons juste à renseigner le chemin du fichier pour obtenir sa dernière modification. ;)
Commençons donc par notre fonction et ses paramètres. Pour cela, nous avons besoin de prendre en compte l'âge minimum que le fichier doit avoir pour être supprimé, l'extension recherchée, et, bien sûr, le répertoire traité. :)
<?php
// Notre fonction contiendra 3 paramètres, comme on vient de le voir.
/* Dans l'ordre :
— le dossier traité ; rappelez-vous, le chemin relatif ;
— l'extension cherchée : ici, je veux que ce soit les gif qui doivent être supprimés (il n'est pas nécessaire de mettre le point avant l'extension) ;
— l'âge minimum, en secondes ; ici j'ai choisi une heure. */
suppression( "images/jpeg" , "gif" , "3600" );
?>
Comme on peut le voir, j'ai choisi d'exécuter une fonction suppression. Il va donc falloir créer cette fonction, en prenant en compte les paramètres choisis. On les placera dans des variables que je vous donne :
$dossier_traite ;
$extension_choisie ;
$age_requis.
Pour l'instant, on ne s'occupe pas de l'extension et du temps dans la fonction. On va se contenter de faire une fonction qui contiendra la même chose que l'on a vue à l'étape précédente. À vous de jouer. ;)
Correction
<?php
// Notre fonction paramétrée.
suppression( "images/jpeg" , "gif" , "3600" );
// La fonction en question.
function suppression($dossier_traite , $extension_choisie, $age_requis)
{
// On ouvre le dossier.
$repertoire = opendir($dossier_traite);
// On lance notre boucle qui lira les fichiers un par un.
while(false !== ($fichier = readdir($repertoire)))
{
// On met le chemin du fichier dans une variable simple.
$chemin = $dossier_traite."/".$fichier;
// On n'oublie pas LA condition sous peine d'avoir quelques surprises. :p
if($fichier!="." AND $fichier!=".." AND !is_dir($fichier))
{
unlink($chemin);
}
}
closedir($repertoire); // On ferme !
}
?>
Voici donc notre fonction. Il n'y a rien à ajouter puisque c'est la même chose que tout à l'heure. Maintenant, nous allons la compléter avec nos critères pour finaliser ce tuto. :)
La fonction et ses critères
Tout d'abord, comment fonctionne pathinfo ?
La fonction pathinfo renvoie, comme je l'ai dit, 3 infos sur le chemin qu'on lui donne. Nous allons nous servir de l'info correspondant à l'extension. Nous intégrerons cette fonction ainsi :
Pour connaître l'âge du fichier, on peut soustraire la date de dernière modification du fichier (son timestamp, bien sûr) au timestamp actuel. Ce qui donne :
<?php $age_fichier = time() - filemtime($chemin);
// Ici aussi, il faut renseigner la fonction avec le chemin du fichier.
?>
Vous pouvez dorénavant créer la fonction entièrement en assimilant ce que nous venons de voir à notre condition if.
Correction et script final ici :
<?php
// Notre fonction paramétrée.
suppression( "images/jpeg" , "gif" , "3600" );
// La fonction en question.
function suppression($dossier_traite , $extension_choisie, $age_requis)
{
// On ouvre le dossier.
$repertoire = opendir($dossier_traite);
// On lance notre boucle qui lira les fichiers un par un.
while(false !== ($fichier = readdir($repertoire)))
{
// On met le chemin du fichier dans une variable simple
$chemin = $dossier_traite."/".$fichier;
// Les variables qui contiennent toutes les infos nécessaires.
$infos = pathinfo($chemin);
$extension = $infos['extension'];
$age_fichier = time() - filemtime($chemin);
// On n'oublie pas LA condition sous peine d'avoir quelques surprises. :p
if($fichier!="." AND $fichier!=".." AND !is_dir($fichier)
$extension == $extension_choisie AND $age_fichier > $age_requis)
{
unlink($chemin);
}
}
closedir($repertoire); // On ferme !
}
?>
Ce script permettra de supprimer les fichiers voulus à chaque chargement de la page PHP dans laquelle il se trouve. Ici, j'ai choisi d'effacer tous les fichiers gif et tous les fichiers dont l'âge est supérieur à 1 heure. Vous pouvez vous-mêmes personnaliser cette fonction en changeant seulement les paramètres en haut du script.
Voilà, ce tuto touche à sa fin. Sachez que ce script n'est pas la seule possibilité pour effacer des fichiers, néanmoins il reste simple. Il peut être aussi très complet si vous ajoutez votre touche personnelle en le complétant de conditions diverses. ;)