Étude de cas : Stocker une date dans le système de fichiers en PHP

Publié le 20 octobre 2009 par Methylbro

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 :

  1. 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
  2. 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 ?

A lire également sur le sujet