Position actuelle: Accueil> Derniers articles> Time_nanosleep Alternative pour une précision insuffisante

Time_nanosleep Alternative pour une précision insuffisante

gitbox 2025-05-26

Dans les applications PHP contrôlées par le temps de haute précision, Time_nanosleep () est une fonction d'outil courante qui permet aux développeurs de "dormir" le programme pendant une période de temps en secondes et en nanosecondes. Cependant, bien qu'il prenne théoriquement en charge les retards de nanoseconde, en usage réel, sa précision est souvent limitée par le mécanisme de planification du système d'exploitation, la mise en œuvre de PHP lui-même et la précision de l'horloge matérielle. Cela signifie que même si vous définissez un retard de 100 microsecondes, le système peut retarder davantage, même en millisecondes.

Si vous créez une application très sensible au temps, comme un simulateur de trading à haute fréquence, un mécanisme de synchronisation d'acquisition de données ou une logique de contrôle en temps réel, alors le "peu fiable" de Time_nanosleep () est particulièrement mortel. Alors, que devons-nous faire quand Time_nanosleep () n'est pas assez précis? Cet article présentera plusieurs alternatives plus fiables.

1. Utilisez usleep () pour obtenir un retard de microseconde

Bien que Usleep () ne puisse pas garantir une précision absolue, sur certains systèmes, sa stabilité est meilleure que Time_nanosleep () .

 usleep(100); // Retard100Microsecondes

Remarque : usleep () accepte les microsecondes au lieu de nanosecondes (1 seconde = 1000000 microsecondes), il ne peut donc pas implémenter directement le retard nanoseconde. Mais dans la plupart des scénarios d'entreprise, les microsecondes sont suffisantes.

2. Utilisez une boucle d'attente très occupée à haute précision (utilisez avec prudence)

Si vous avez besoin d'un contrôle de niveau de nanoseconde, il peut être réalisé grâce à l'attente du CPU. Cette méthode consiste à lire en continu le temps de haute précision jusqu'à ce qu'un intervalle prédéterminé soit atteint, mais il consomme beaucoup de CPU et ne convient pas aux environnements de production.

 function nano_sleep_busy($nanoseconds) {
    $start = hrtime(true);
    $end = $start + $nanoseconds;
    while (hrtime(true) < $end);
}
nano_sleep_busy(50000); // Retard50Microsecondes

HRtime (true) renvoie l'horodatage nanoseconde actuel, adapté à un contrôle précis des intervalles de temps.

3. Avec des extensions externes ou des outils CLI

Pour les systèmes avec des exigences extrêmes, les propres capacités de PHP peuvent être insuffisantes. À l'heure actuelle, vous pouvez appeler les outils CLI ou les commandes au niveau du système écrit en C / C ++ pour terminer un retard de haute précision.

Par exemple, appelez un programme exécutable compilé (en supposant que vous avez déjà un outil Sleep_NS ):

 exec('/usr/local/bin/sleep_ns 50000'); // Retard50Microsecondes

Vous pouvez également placer cet outil sur un serveur que vous contrôlez, par exemple:

 file_get_contents("https://gitbox.net/tools/sleep_ns?duration=50000");

De cette façon, la logique de contrôle peut être transmise à une langue plus appropriée à exécuter.

4. Utiliser l'événement ou l'extension Swoole (recommandée)

Si votre environnement PHP prend en charge Swoole ou utilise le mécanisme ReactPHP / Loop Event, vous pouvez effectuer un contrôle de retard de haute précision grâce à des méthodes non bloquantes asynchrones.

 Swoole\Timer::after(0.05, function () {
    echo "50Microsecondes后执行\n";
});

Bien que la couche sous-jacente repose toujours sur les minuteries du système, car Swoole est écrit en C et contourne le moteur d'exécution de PHP, la précision et les performances sont meilleures que les fonctions natives.

Résumer

méthode Granularité du retard minimum Précision Si elle est bloquée Utilisation suggérée
Time_nanosleep Nanosecondes Faible Oui Scénario de retard normal
dormant Microsecondes moyen Oui Retard <1 seconde
Attente occupée + hrtime Nanosecondes haut Oui (CPU élevé) Exigences de précision extrême
Outils externes Dépend de la mise en œuvre haut Contrôlable Intégrer au système
Swoole / Reactphp Microsecondes haut Non Scénarios élevés de concurrence / coroutine

Dans la plupart des scénarios, si vous voulez simplement contrôler avec précision le retard par des dizaines à des centaines de microsecondes, la combinaison de usleep () et hrtime () est déjà très pratique. Et si vous créez une application haute performance qui est extrêmement sensible à la latence, il est recommandé d'utiliser un cadre asynchrone (tel que Swoole) ou de passer à un langage sous-jacent plus approprié pour implémenter certaines des fonctions.

N'oubliez pas: PHP n'est pas une langue conçue pour un contrôle en temps réel. Ce n'est qu'en choisissant des limites techniques raisonnablement que vous pouvez écrire un programme fiable et efficace.