Position actuelle: Accueil> Derniers articles> Résolvez le problème de la perte de précision microseconde dans GetTimeOfday

Résolvez le problème de la perte de précision microseconde dans GetTimeOfday

gitbox 2025-05-26

En PHP, l'obtention de la partie microseconde de l'heure actuelle est généralement utilisée pour utiliser la fonction getTimeOfday () . Cette fonction peut renvoyer les secondes et les microsecondes de l'heure actuelle, et la précision doit être très élevée. Cependant, dans une utilisation réelle, de nombreux développeurs constatent que la précision de la partie microseconde n'est pas comme prévu, et qu'il y a des pertes ou des inexactitudes, ce qui entraîne des calculs impayés liés au temps, en particulier dans des scénarios avec des exigences de performances ou d'horodatage extrêmement élevées.

Cet article analysera les raisons de la perte de la précision GetTimeOfday () en profondeur et fournira plusieurs solutions efficaces pour résoudre le problème de l'inexactitude des microsecondes en PHP.


1. Fonction GetTimeOfday et ses problèmes de précision

GetTimeOfday () Renvoie un tableau contenant deux champs clés:

  • SEC : secondes depuis l'époque Unix

  • USEC : le nombre de microsecondes dans la seconde actuelle

Dans des circonstances normales, l'USEC doit être exact à un millionième de seconde, mais dans certains systèmes ou versions PHP, l'USEC n'est pas complètement fiable et peut avoir une faible précision ou même zéro.

 <?php
$time = gettimeofday();
echo "Seconds: " . $time['sec'] . "\n";
echo "Microseconds: " . $time['usec'] . "\n";
?>

Si vous constatez dans votre test que l'USEC est toujours nul, ou si le changement est très faible, il s'agit probablement d'un problème de niveau d'appel système ou d'une limitation de la fonction de liaison PHP elle-même.


2. Méthodes pour obtenir l'heure actuelle avec une précision plus élevée en PHP

1. Utilisez un microme (vrai)

MicroTime () est une fonction plus couramment utilisée en PHP pour obtenir des horodatages microsecondes. Appeler MicroTime (True) renvoie un horodatage décimal des secondes avec des microsecondes.

 <?php
$microtime = microtime(true);
echo "Current time with microseconds: " . $microtime . "\n";
?>

Microme (VRAI) renvoie un format de point flottant, avec des microsecondes après secondes + point décimal, et la précision est généralement plus stable. Il est recommandé de l'utiliser au lieu de getTimeOfday () .


2. Utilisez hrtime () pour atteindre le temps de niveau nanoseconde

Les versions PHP 7.3 et ultérieures prennent en charge HRtime () , qui est un minuteur de haute précision qui renvoie le temps nanoseconde, adapté aux scénarios avec des exigences extrêmement élevées pour la précision de mesure du temps.

 <?php
// Renvoie le nombre de nanosecondes de l&#39;heure actuelle
$nanoseconds = hrtime(true);
echo "High resolution time in nanoseconds: " . $nanoseconds . "\n";

// Convertir les nanosecondes en secondes + Microsecondes
$seconds = floor($nanoseconds / 1e9);
$microseconds = floor(($nanoseconds % 1e9) / 1e3);
echo "Seconds: $seconds, Microseconds: $microseconds\n";
?>

HRtime () ne représente pas le temps du système, mais un minuteur de haute précision, adapté aux tests de performances et à d'autres besoins.


3. Personnalisez le format de temps microseconde

Si vous devez formater la sortie dans le temps et que les microsecondes sont exacts, vous pouvez combiner DateTime et DateTimeimutable pour le gérer:

 <?php
$date = DateTime::createFromFormat('U.u', microtime(true));
echo $date->format("Y-m-d H:i:s.u") . "\n";
?>

Cela publie une chaîne de temps contenant des microsecondes, avec un format précis et lisible.


3. Résumé

  • GetTimeOfday () aura une précision de microsecondes insuffisante dans certains environnements, et il n'est pas recommandé de s'y fier pour des mesures de temps de haute précision.

  • Utilisez un microme (vrai) pour obtenir un horodatage avec des microsecondes, ce qui est simple et pratique, et a une bonne compatibilité.

  • Si vous avez besoin d'un calendrier de précision plus élevé, il est recommandé d'utiliser PHP 7.3+ hrtime () , qui prend en charge le timing au niveau de la nanoseconde.

  • L'objet DateTime combiné avec MicroTime (true) peut facilement atteindre le temps formaté de sortie avec des microsecondes.

Ces méthodes peuvent être utilisées en combinaison pour résoudre le problème de l'inexactitude des microsecondes en PHP et garantir que les besoins de précision de votre application sont satisfaits.


 <?php
// exemple:utiliser microtime(true) Obtenez l&#39;heure actuelle et formatez la sortie
$microtime = microtime(true);
$date = DateTime::createFromFormat('U.u', $microtime);
echo "当前时间带Microsecondes:" . $date->format("Y-m-d H:i:s.u") . "\n";

// utiliser hrtime() Obtenez un temps de haute précision
$nanoseconds = hrtime(true);
$seconds = floor($nanoseconds / 1e9);
$microseconds = floor(($nanoseconds % 1e9) / 1e3);
echo "Minuterie de haute précision - Deuxième: $seconds, Microsecondes: $microseconds\n";

// Adresse du document de référence:https://gitbox.net/php/manual/en/function.microtime.php
?>