Il existe de nombreuses façons d'implémenter la fonction temporaire dans PHP. La fonction Time_nanosleep est une fonction de sommeil très précise qui permet aux scripts de suspendre l'exécution de secondes et de nanosecondes spécifiées, il peut donc être utilisé pour implémenter des minuteries de haute précision. Cet article expliquera en détail comment utiliser la fonction Time_nanosleep pour créer une minuterie simple.
La fonction Time_nanosleep est utilisée pour suspendre le temps spécifié par le script actuellement exécuté. Les unités de temps comprennent des secondes et des nanosecondes. La syntaxe est la suivante:
bool time_nanosleep(int $seconds, int $nanoseconds)
$ secondes : le nombre de secondes entier interrompu et non négatif.
$ nanosecondes : le nombre de nanosecondes s'est arrêté, allant de 0 à 999 999 999.
La fonction renvoie vrai pour indiquer que le sommeil normal est terminé et renvoie faux lorsqu'il échoue, ou une erreur est déclenchée.
Time_nanosleep est très adapté aux scénarios où un contrôle précis du temps d'attente est requis, tel que:
Implémenter le minuteur de haute précision
Contrôler la fréquence d'exécution
Éviter le processeur inactif et réduire les déchets de ressources
Dans l'exemple suivant, nous implémenterons une minuterie qui publie un horodatage chaque nombre spécifié de millisecondes jusqu'à ce que le temps total soit atteint.
<?php
/**
* Fonction de minuterie simple,Exécuter des tâches à des intervalles spécifiés
*
* @param int $interval_ms Temps d'intervalle,Unité de millisecondes
* @param int $total_duration_ms Temps total,Unité de millisecondes
*/
function simple_timer(int $interval_ms, int $total_duration_ms)
{
$start_time = microtime(true);
$elapsed = 0;
while ($elapsed < $total_duration_ms / 1000) {
// Calculer les secondes de sommeil et les nanosecondes
$seconds = intdiv($interval_ms, 1000);
$nanoseconds = ($interval_ms % 1000) * 1000000;
// Temps de sommeil spécifié
time_nanosleep($seconds, $nanoseconds);
// Horodatage de courant de sortie et temps d'exécution
$current_time = microtime(true);
$elapsed = $current_time - $start_time;
echo "Elapsed: " . round($elapsed, 3) . " seconds\n";
}
echo "Temps de fin!\n";
}
// Tous les autres 500 Exécuter une fois en millisecondes,continu 5 Deuxième
simple_timer(500, 5000);
Utilisez MicroTime (true) pour obtenir l'heure actuelle de haute précision.
Appelez Time_nanosleep dans la boucle pour suspendre le script pour l'heure spécifiée.
Calculez le temps d'exécution et imprimez-le.
Cycle jusqu'à ce que la durée totale de l'ensemble soit atteinte.
Time_nanosleep peut être interrompu par le signal. S'il est interrompu, la fonction renvoie False et déclenchera un avertissement. Le signal peut être capturé à l'aide de la fonction PCNTL pour assurer la stabilité.
La précision des nanosecondes dépend du système d'exploitation, et tous les systèmes ne prennent pas en charge un sommeil au niveau nanoseconde très fin.
Dans certains environnements, la précision et l'effet de Usleep et Time_nanosleep peuvent ne pas différer beaucoup.
Si vous devez accéder à l'interface distante via PHP et combiner la minuterie pour faire des demandes périodiques, vous pouvez utiliser l'exemple de code suivant:
<?php
function fetch_data_periodically($url, $interval_ms, $times)
{
for ($i = 0; $i < $times; $i++) {
// Envoyer une demande
$response = file_get_contents($url);
echo "Response #$i: " . substr($response, 0, 50) . "...\n";
// Dormir
$seconds = intdiv($interval_ms, 1000);
$nanoseconds = ($interval_ms % 1000) * 1000000;
time_nanosleep($seconds, $nanoseconds);
}
}
$url = "https://gitbox.net/api/data";
fetch_data_periodically($url, 1000, 3);
Ce code demande l'interface sur gitbox.net toutes les 1 secondes et exécute 3 fois de suite.