La fonction microtime() renvoie le nombre de secondes et de microsecondes écoulées depuis le 1/1/1970.
Suivant la valeur du paramètre booléen get_as_float, la fonction renvoie un nombre décimal ou une chaîne de caractères composée de 2 sous-chaînes :
On a ici l'impression que microtime() "fonctionne moins bien" quand on lui transmet TRUE pour qu'elle renvoie un nombre flottant car la précision des nombres décimaux serait insuffisante pour représenter un timestamp avec une précision de 1µs. Mais c'est en réalité un peu plus compliqué...
Pour récupérer un nombre décimal à partir de la 'chaîne microtime', nous pouvons utiliser les fonctions explode() et substr() comme dans l'exemple suivant.
Explications :
Conclusion : on peut utiliser la fonction microtime() en lui transmettant TRUE sans perte de précision, mais il faut prendre des précautions quand on affiche le résultat.
Le comptage du temps en microsecondes peut être utilisé par exemple pour mesurer les temps d'exécution d'un script ou de ses parties ou comme base pour la génération de nombre aléatoire.
Nous allons construire un chronomètre qui permettra de mesurer les temps d'exécution de parties de script.
C'est la fonction chronometrer qui fait tout le travail.
function chronometrer($txt = '', $precis = 5) {
static $debut, $texte, $precision;
// Debut du chronométrage
if ($txt != '') {
$texte = $txt;
$precision = $precis;
$debut = microtime();
return; // Fin du début
}
// Arrêt du chronométrage
$fin = microtime();
$t = explode(' ', $debut);
$debut = $t[1].substr($t[0], 1);
$t = explode(' ', $fin);
$fin = $t[1].substr($t[0], 1);
echo '<hr>Temps (', $texte, ') : ',
round(bcsub($fin, $debut, 6), $precision),
'<hr>';
}
Si le paramètre $txt contient quelque chose, le chronomètre est initialisé.
Si le paramètre $txt est vide, nous considérons que le chronométre est arrêté. Nous récupérons la valeur du moment, transformons le moment du début et le moment de fin en chaines numériques, puis affichons le temps d'exécution en soustrayant les deux valeurs numériques et en les arrondissant à la précision voulue.
Notez :
L'utilisation de bcsub() n'est ici pas nécessaire, car comme déjà expliqué, la précision des nombres flottants utilisés par PHP est suffisante pour mémoriser le nombre de secondes et de microsecondes écoulés depuis le 1/1/1970. Nous avons utiliser bcsub() juste pour vous indiquer que PHP dispose de fonctions qui permettent la manipulation de nombres de grande taille.
Ici, on a le fait le choix d'implémenter la fonction chronometrer()
comme si le type float ne permettait pas
de représenter un timestamp avec une précision satisfaisante.
On peut bien entendu simplifier le code de la fonction chronometrer()
en transmettant le paramètre TRUE à la fonction
microtime().