Dans les tâches de haute précision ou les applications PHP sensibles au temps, le sommeil ordinaire () ou l'USLOep () ne répond souvent pas aux exigences de contrôle des retards de nanoseconde. Sleep () ne peut être précis qu'en secondes. Bien que Usleep () prenne en charge les microsecondes, il est toujours impossible d'obtenir un contrôle stable de haute précision en raison du mécanisme de planification et des limitations de précision du système de PHP.
Pour résoudre ce problème, la fonction time_nanosleep () fournit un moyen de contrôle de retard plus raffiné. Cet article présentera comment combiner microtime (true) et time_nanosleep () pour obtenir un contrôle de retard précis.
Time_nanosleep () est une fonction fournie par PHP pour le retard au niveau de la nanoseconde. Son prototype de fonction est le suivant:
bool time_nanosleep(int $seconds, int $nanoseconds)
Il vous permet de spécifier une combinaison de "secondes" et "nanosecondes" pour faire une pause en cours d'exécution. Par exemple, si vous souhaitez retarder de 1,5 milliseconde (c'est-à-dire 1500000 nanosecondes), vous pouvez utiliser la méthode suivante:
time_nanosleep(0, 1500000);
Remarque: Le comportement de Time_nanosleep () est toujours affecté par la précision de l'horloge du système et la mise en œuvre de PHP, et la vraie précision peut être légèrement biaisée. Mais dans la plupart des applications, il est plus stable que Usleep () .
Parfois, nous devons non seulement retarder le temps fixe, mais nous voulons également nous assurer que le code est contrôlé avec précision dans un délai à partir d'un certain point à la fin d'un certain point. À l'heure actuelle, le microme (vrai) est très utile, il renvoie l'horodatage microseconde depuis l'époque Unix, avec une précision plus élevée.
Ce qui suit est un exemple de contrôle de retard implémenté à l'aide de Time_nanosleep () et de la combinaison microtime (vrai) :
<?php
// Temps de retard cible(En quelques secondes)
$targetDelay = 0.005; // 5 millisecondes
$start = microtime(true);
// Simuler l'exécution de certaines opérations
for ($i = 0; $i < 1000; $i++) {
// Supposons que ce cycle consomme un certain temps
}
// Calculez le temps consommé
$elapsed = microtime(true) - $start;
// Temps requis pour un retard supplémentaire
$remainingDelay = $targetDelay - $elapsed;
if ($remainingDelay > 0) {
// Diviser le temps restant en secondes et nanosecondes
$seconds = (int)$remainingDelay;
$nanoseconds = (int)(($remainingDelay - $seconds) * 1e9);
// Retard précis
time_nanosleep($seconds, $nanoseconds);
}
// Vérification totale de longue date
$totalTime = microtime(true) - $start;
echo "Consommation de temps totale: " . round($totalTime * 1000, 3) . " millisecondes\n";
Contrôler les intervalles d'échantillonnage dans le système d'acquisition en temps réel
Fonction de téléchargement / téléchargement de limite de vitesse (comme limiter la fréquence d'accès à une certaine URL)
Simuler les retards du réseau lors du test de certains comportements de réponse à l'interface
Par exemple, lors de la mise en œuvre d'un demandeur d'API de limite de vitesse:
<?php
$urls = [
"https://gitbox.net/api/data/1",
"https://gitbox.net/api/data/2",
"https://gitbox.net/api/data/3"
];
$interval = 0.2; // Chaque 200 millisecondes请求一次
foreach ($urls as $url) {
$start = microtime(true);
// Demande de simulation
file_get_contents($url);
$elapsed = microtime(true) - $start;
$remaining = $interval - $elapsed;
if ($remaining > 0) {
time_nanosleep(0, (int)($remaining * 1e9));
}
}
De cette façon, nous pouvons contrôler l'intervalle entre chaque demande plus précisément, éviter de faire pression sur le serveur cible ou répondre aux besoins rythmiques de nos propres applications.
Time_nanosleep () n'est pas un "dur en temps réel" dans les systèmes d'exploitation en temps réel et ne peut garantir une précision à 100%, mais elle est suffisante pour une utilisation dans des occasions non critiques.
Certaines plates-formes ou versions compilées PHP peuvent ne pas prendre en charge Time_nanosleep () . Il est recommandé de confirmer si la fonction est disponible avant utilisation.
Si une précision de synchronisation plus stable est requise, d'autres langues (telles que C) ou un support au niveau du système peuvent devoir être prises en compte.
L'utilisation de Time_nanosleep () avec MicroTime (true) peut obtenir un contrôle de retard plus précis que Usleep () en PHP, ce qui convient aux scénarios avec des exigences élevées pour le contrôle du temps. Bien qu'il soit encore limité par la planification du système et les détails de l'implémentation PHP, il offre une précision et une flexibilité suffisantes dans la plupart des applications et est un outil important pour le contrôle de latence raffiné.