Position actuelle: Accueil> Derniers articles> Créer une fonction de minuterie PHP avec Time_nanosleep

Créer une fonction de minuterie PHP avec Time_nanosleep

gitbox 2025-05-28

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.

Qu'est-ce que Time_nanosleep ?

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.

Utiliser des scénarios

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

Implémentation d'un exemple de minuterie simple

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&#39;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&#39;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);

Analyse de code

  • 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.

Choses à noter

  • 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.

Combiné avec des exemples de ressources distantes

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.