Étude de cas : Stocker une date dans le système de fichiers en PHP
Par Méthylbro le mardi 20 octobre 2009, 08:00 - Tutoriels - Lien permanent
En travaillant sur un script écrit par quelqu'un d'autre, j'ai eu l'idée de ce petit tutoriel. En effet au sein d'un script que j'ai du modifier j'ai découvert une portion de code qui m'a quelque peut alerté.
Nous allons voir comment le développeur aurait pu résoudre son problème avec une solution alternative.
Dans notre exemple nous devrons stocker une date dans le système de fichiers côté serveur puis pouvoir venir la récupérer et la mettre à jour lors d'une autre exécution du script.
Voici mot pour mot la solution qui a été retenue par le développeur dont j'ai du modifier le script :
// Ecriture de l'heure courante dans fichier, pour comparaison ulterieure
$fichier_memoire = "memoire.db";
// Lecture de la derniere heure sauvegardee
// Ajouter protections
$fp_l = fopen($fichier_memoire, 'r');
$last_date = fread($fp_l, 6);
$suc=fclose ($fp_l);
// L'heure courante brute //
$date_propre = date('H:i');
$fp_m=fopen($fichier_memoire, w);
$suc=fputs($fp_m, "$date_propre");
$suc=fclose ($fp_m);
Comme vous pourrez le voir, l'opération se déroule en deux temps :
- d'abord on ouvre un flux en lecture vers le fichier pour récupérer la date stockée comme une chaîne de caractère en son sein
- ensuite on ouvre un flux en écriture seule vers le fichier pour venir enregistrer la date à l'intérieur comme une chaîne de caractères
Ce que je reproche à cette méthode, c'est d'ouvrir inutilement et à deux reprises un flux vers le fichier (d'abord en lecture puis en écriture).
En effet le système de fichier nous propose déjà d'obtenir toute une foule d'information avant même d'ouvrir celui-ci. Son nom, le nom de son propriétaire, sa taille, sa date de création, sa date de dernière modification etc.
Pourquoi alors ne pas utiliser directement ces informations ? Cela nous éviterais d'avoir ouvrir notre fichier.
Pour cela je vais vous proposer d'utiliser la date de dernière modification pour stocker l'information qui nous intéresse.
// format de date que l'on utilisera à l'affichage
define('DATE_FORMAT', 'Y/d/m H:i:s');
// nom du fichier
$filename = 'filetest';
// ensemble des informations sur le fichier
$fileinfos = stat($filename);
// date de dernière modification que l'on donnera au fichier
$time = time();
// Si le fichier existe déjà, on montre ca date de dernière modification
if (file_exists($filename))
echo 'last update : '.date(DATE_FORMAT, $fileinfos['mtime']).'
';
// On modifie la date de dernière modification du fichier
// Si ce dernier n'existe pas, on le crée
if (touch($filename, $time))
echo 'update on : '.date(DATE_FORMAT, $time);
Pour stocker une date dans le système de fichier afin de revenir la chercher plus tard, quelle solution préférait vous ? Ouvrir toute une série de flux vers le fichier ou manipuler directement les informations relatives à ce dernier ?

Commentaires
Je trouve ta méthode utile et pratique !
Car pour récupérer une date et/ou la modifier, il n'est pas nécessaire de créer des flux(ouvrir,lecture,écriture).
Très bon cas pratique pour d'optimisation de code.;-)
Pourquoi stat au lieu de filemtime ?
@Anthor : Parce que je n'y ai pas pensé.
C'est mieux d'utiliser filemtime en effet ^^