PDA

Voir la version complète : Problème : Heures différentes de filemtime et filectime pour touch et fopen ()


qube
20/02/2004, 11h47
Contrairement à ce que l'on pourrait attendre, un fichier créé par touch () et par fopen () n'aura pas la même heure de modification (filemtime ()) : fopen ne crée pas un fichier correspondant à l'heure telle que donnée par date (). Pour un code d'exemple, voir ci-dessous.

De plus, les dates des fichiers enregistrés par FTP correspondent à la date "fopen ()", par à la date "date ()".
C'est l'heure donnée par date () qui est la bonne.

D'où vient ce bug? Si ce n'en est pas un, où est-il expliqué? Pouvez-vous le corriger?

Cela cause des problèmes par exemple lorsqu'on compare des dates de création ou modification de fichiers, pour invalider des fichiers de cache par exemple en comparant les filemtime () de deux fichiers, l'un envoyé par FTP, l'autre touch()é...

Enfin, notez qu'un fichier créé dans le répertoire du site web et le même, créé dans le répertoire temporaire (en utilisant tempnam ()) n'ont pas les mêmes dates de création et modification entre eux!

Démonstration :

<?php
function showMTimeAndUnlink ($fileName) {
clearstatcache ();
echo 'filemtime : ' . date ('r', filemtime ($fileName)) . '<br />';
echo 'filectime : ' . date ('r', filectime ($fileName)) . '<br />';
unlink ($fileName);
}

echo 'Date : ' . date ('r') . '<br />';
$tmpFileName = tempnam ('', '');
echo 'Touch file : ' . $tmpFileName . '<br />';
touch ($tmpFileName);
showMTimeAndUnlink ($tmpFileName);
echo 'Fopen file : ' . $tmpFileName . '<br />';
$f = fopen ($tmpFileName, 'w+');
fclose ($f);
showMTimeAndUnlink ($tmpFileName);
$tmpFileName = $_SERVER['DOCUMENT_ROOT'] . tempnam ('', '');
echo 'Touch file : ' . $tmpFileName . '<br />';
touch ($tmpFileName);
showMTimeAndUnlink ($tmpFileName);
echo 'Fopen file : ' . $tmpFileName . '<br />';
$f = fopen ($tmpFileName, 'w+');
fclose ($f);
showMTimeAndUnlink ($tmpFileName);
?>


Donne pour résultat :

Date : Fri, 20 Feb 2004 12:36:58 +0100
Touch file : /tmp/Am0anv
filemtime : Fri, 20 Feb 2004 12:36:58 +0100
filectime : Fri, 20 Feb 2004 12:36:58 +0100
Fopen file : /tmp/Am0anv
filemtime : Fri, 20 Feb 2004 12:36:58 +0100
filectime : Fri, 20 Feb 2004 12:36:58 +0100
Touch file : /home/{site}/www/tmp/Ibro3L
filemtime : Fri, 20 Feb 2004 12:36:59 +0100
filectime : Fri, 20 Feb 2004 12:24:03 +0100
Fopen file : /home/{site}/www/tmp/Ibro3L
filemtime : Fri, 20 Feb 2004 12:24:03 +0100
filectime : Fri, 20 Feb 2004 12:24:03 +0100

J'ai donc environ 12 minutes de différence entre les deux dates!
Notez que filemtime et filectime peuvent ou non avoir la même valeur, et que cette valeur peut ou non être la date courante...