Lors de la rédaction d'applications PHP haute performance ou sensibles au temps, nous avons parfois besoin que le programme interrompre l'exécution pendant de très courtes périodes, tels que des millisecondes ou même des microsecondes plus fins ou des niveaux de nanoseconde. Cette exigence est particulièrement importante lors de la gestion du contrôle de la synchronisation de précision, de la limitation des demandes ou de l'interaction avec le matériel. Heureusement, PHP fournit une fonction intégrée time_nanosleep () qui permet des pauses qui sont exactes aux nanosecondes. Cet article vous emmènera dans la compréhension approfondie de l'utilisation et des précautions de cette fonction, et fournira plusieurs exemples pratiques pour vous aider à le maîtriser de manière flexible.
Time_nanosleep () est une fonction de PHP qui fait une pause pour spécifier les secondes et les nanosecondes. La signature de la fonction est la suivante:
bool time_nanosleep ( int $seconds , int $nanoseconds )
$ secondes : entier, indiquant le nombre de secondes à faire une pause.
$ nanosecondes : entier, indiquant le nombre de nanosecondes à faire une pause (entre 0 et 9999999999).
Cette fonction peut être utilisée pour faire une pause à tout moment inférieure à une seconde, atteignant ainsi un retard de niveau inférieur à la seconde.
PHP a également deux fonctions de pause couramment utilisées: sleep () et usleep () . Les différences entre elles sont les suivantes:
Sleep (int $ secondes) : uniquement précis en secondes.
USLOEPT (Int $ microsecondes) : précis aux microsecondes (un millionième de seconde).
Time_nanosleep (int $ seconds, int $ nanoseconds) : prend en charge la précision des nanosecondes (un milliardième de seconde).
Par conséquent, Time_nanosleep () est un meilleur choix lorsque vous avez besoin d'un contrôle de temps de précision plus élevé.
Voici un exemple simple d'utilisation, une pause pendant 0,5 seconde (c'est-à-dire 500 millisecondes):
<?php
echo "Start: " . microtime(true) . PHP_EOL;
time_nanosleep(0, 500000000); // pause 0.5 Deuxième
echo "End: " . microtime(true) . PHP_EOL;
?>
La sortie ressemblera à:
Start: 1716026901.12345
End: 1716026901.62346
Comme vous pouvez le voir, le programme s'est arrêté pendant environ 0,5 seconde.
Supposons que vous souhaitiez exécuter un certain morceau de code toutes les 200 millisecondes, vous pouvez utiliser la méthode suivante:
<?php
for ($i = 0; $i < 5; $i++) {
echo "Tick $i at " . microtime(true) . PHP_EOL;
time_nanosleep(0, 200000000); // 200 毫Deuxième
}
?>
Cette méthode d'écriture peut être utilisée efficacement dans des scénarios tels que l'envoi de demandes de limitation, les journaux de sortie de synchronisation, les capteurs de sondage, etc.
Time_nanosleep () peut revenir à l'avance en raison de l'interruption du signal (telles que les signaux POSIX) dans certains systèmes et retourne faux . Dans ce cas, un mécanisme de réessayer en boucle peut être utilisé.
<?php
$seconds = 0;
$nanoseconds = 250000000; // 250 毫Deuxième
do {
$result = time_nanosleep($seconds, $nanoseconds);
} while ($result === false && ($error = error_get_last()) && strpos($error['message'], 'interrupted') !== false);
?>
Bien que la plupart des applications ordinaires ne rencontrent pas de telles interruptions, ce type de protection est recommandé dans des environnements multi-thread ou très concurrencés.
Supposons que vous développez une API pour les appareils matériels qui doivent interroger l'interface de données tous les 1 millisecondes, vous pouvez l'écrire comme ceci:
<?php
$url = 'https://gitbox.net/api/device/status';
for ($i = 0; $i < 1000; $i++) {
$response = file_get_contents($url);
echo "[$i] Response: $response" . PHP_EOL;
time_nanosleep(0, 1000000); // 1 毫Deuxième
}
?>
Cette méthode d'écriture peut effectuer une traction de données à haute fréquence sans provoquer une explosion d'occupation du processeur.
Time_nanosleep () est disponible depuis PHP 5 et est disponible dans presque toutes les versions grand public.
Il peut fonctionner sur les systèmes Windows et Unix.
Bien qu'il prenne en charge la nanoseconde entrante, la précision dépend en fait de la résolution de l'horloge du système. Sur certaines plates-formes, la précision minimale peut encore être en microsecondes.
Time_nanosleep () est une fonction puissante mais souvent négligée dans PHP. Il offre aux développeurs la possibilité de contrôler subtilement le temps de pause du programme, en particulier pour les tâches qui nécessitent un contrôle de temps élevé. Grâce à l'explication et aux exemples de ce tutoriel, vous devriez être en mesure de maîtriser comment l'appliquer de manière flexible pour améliorer le contrôle et les performances de votre application. Tant que vous faites attention à la manipulation d'interruption et aux restrictions système utilisées, Time_nanosleep () peut être utilisé en toute sécurité et avec précision dans divers scénarios.