2010-05-27 6 views
6

Là, j'écris actuellement un test unitaire qui affirme qu'un fichier n'a pas été modifié. L'exécution du code de test prend moins d'une seconde et donc je voudrais savoir s'il est possible de récupérer le temps de modification du fichier en millisecondes. La fonction filemtime() renvoie l'horodatage UNIX en secondes.Temps de modification du fichier PHP en millisecondes

Ma solution actuelle utilise la fonction sleep (1) qui m'assure qu'une seconde s'est écoulée avant de vérifier si elle a été modifiée ou non. Je n'aime pas cette solution, car elle ralentit beaucoup le test.

Je ne peux pas affirmer l'égalité de contenu via get_file_contents() puisque les données qui peuvent être réécrites seraient les mêmes.

Je suppose que c'est impossible, n'est-ce pas?

Répondre

2

AFAIK La précision de l'horodatage UNIX est de quelques secondes, ce qui peut ne pas être possible.

BTW, notez que PHP met en cache la valeur de retour de filemtime() en interne, donc clearstatcache() doit être appelée auparavant.

Une méthode alternative pourrait être de modifier (ou supprimer) le contenu du fichier en premier afin que vous puissiez facilement identifier les changements. Puisque l'état du système devrait rester le même après l'exécution de chaque test, il serait logique de restaurer le contenu du fichier d'origine après l'exécution du test unitaire.

+0

J'aime l'idée, je préfère manipuler le contenu que dormir pendant 1 seconde, ce qui est beaucoup plus rapide. Merci pour le conseil. –

4

Essayez cette commande simple:

ls --full-time 'filename' 

et vous pouvez voir la précision d'horodatage de fichier n'est pas seconde, il est plus précis. (en utilisant Linux, mais ne pense pas qu'il diffère sous Unix) mais je ne connais toujours pas de fonction PHP pour obtenir un horodatage précis, peut-être que vous pouvez analyser le résultat de l'appel système.

1

Si le système de fichiers est ext4 (commun sur unix plus récents/Ubuntu) comme les systèmes Linux ou ntfs (Windows), le mtime fait avoir une précision sous-seconde.

Si le système de fichiers est ext3 (ou peut-être d'autres, c'était la norme il y a un certain temps et est toujours utilisé par RHEL), le mtime est seulement stocké à la seconde près. Peut-être que ce vieux défaut est pourquoi PHP ne supporte que mtime à la seconde près.

Pour récupérer la valeur en PHP, vous devez appeler un util externe, puisque PHP lui-même ne le supporte pas.

(je l'ai testé ce qui suit sur un système avec un environnement local anglais seulement, la sortie de stat peut différer, ou le comportement strtotime « lisible » peut différer sur les paramètres régionaux non anglais, il devrait fonctionner correctement dans un fuseau horaire,. que la sortie du stat comprend un spécificateur de fuseau horaire qui est honorée par strtotime)

class FileModTimeHelper 
{ 
    /** 
    * Returns the file mtime for the specified file, in the format returned by microtime() 
    * 
    * On file systems which do not support sub-second mtime precision (such as ext3), the value 
    * will be rounded to the nearest second. 
    * 
    * There must be a posix standard "stat" on your path (e.g. on unix or Windows with Cygwin) 
    * 
    * @param $filename string the name of the file 
    * @return string like microtime() 
    */ 
    public static function getFileModMicrotime($filename) 
    { 
     $stat = `stat --format=%y $filename`; 
     $patt = '/^(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)\.(\d+) (.*)$/'; 
     if (!preg_match($patt, $stat, $matches)) { 
      throw new \Exception("Unrecognised output from stat. Expecting something like '$patt', found: '$stat'"); 
     } 
     $mtimeSeconds = strtotime("{$matches[1]} {$matches[3]}"); 
     $mtimeMillis = $matches[2]; 
     return "$mtimeSeconds.$mtimeMillis"; 
    } 
} 
+0

(Il serait peut-être plus prudent d'éviter l'appel '' strtotime'' en utilisant par exemple '' stat --format = "% Y% y" $ filename' ', mais j'ai écrit cette version maintenant.) – Rich

3
function getTime($path){ 
    clearstatcache($path); 
    $dateUnix = shell_exec('stat --format "%y" '.$path); 
    $date = explode(".", $dateUnix); 
    return filemtime($path).".".substr($date[1], 0, 8); 
} 

getTime ("myTestTile.");

Questions connexes