Position actuelle: Accueil> Derniers articles> Utilisez Time_nanosleep pour obtenir un contrôle précis du temps de sommeil

Utilisez Time_nanosleep pour obtenir un contrôle précis du temps de sommeil

gitbox 2025-05-28

En PHP, nous devons souvent suspendre le programme pendant une période de temps, ce qui est très courant lorsque vous traitez des interrogations, des tâches de synchronisation ou des opérations de limite de vitesse. Habituellement, les gens utiliseront la fonction Sleep () pour y parvenir, mais l'unité de sommeil () est des secondes, ce qui ne peut pas répondre aux exigences de contrôle précises pour les millisecondes ou même les nanosecondes. À l'heure actuelle, PHP fournit la fonction Time_nanosleep () , qui vous permet de contrôler le temps de pause avec la précision des secondes et des nanosecondes.

Qu'est-ce que Time_nanosleep () ?

Time_nanosleep () est une fonction fournie dans PHP 5.0.0 et au-dessus pour faire en sorte que le processus actuel en pause le nombre spécifié de secondes et de nanosecondes. Comparé à Sleep () , il ne peut être précis que pour quelques secondes, Time_nanosleep () vous permet de contrôler le temps de pause de manière plus flexible.

La définition de la fonction est la suivante:

 bool time_nanosleep(int $seconds, int $nanoseconds)
  • $ secondes : le nombre de secondes interrompues, entier.

  • $ nanosecondes : le nombre de nanosecondes interrompus, entier, varie de 0 à 999 999 999.

Si la pause réussit, la fonction renvoie true et si elle est interrompue par un signal au milieu, il renvoie un tableau contenant le temps restant.

Exemple d'utilisation

Voici un exemple simple de la façon de faire une pause pendant 1 seconde et 500 millisecondes (c'est-à-dire 1,5 seconde):

 <?php
echo "Heure de début:" . microtime(true) . PHP_EOL;

$seconds = 1;
$nanoseconds = 500000000; // 500 millisecondes = 500,000,000 Nanosecondes

if (time_nanosleep($seconds, $nanoseconds)) {
    echo "Temps de fin de sommeil:" . microtime(true) . PHP_EOL;
} else {
    echo "Le sommeil interrompu" . PHP_EOL;
}
?>

Le résultat de l'exécution montrera deux fois l'horodatage, avec un décalage horaire d'environ 1,5 seconde.

Manipuler les interruptions

Si Time_nanosleep () est interrompu par le signal du système, un tableau sera retourné contenant les secondes et les nanosecondes restantes. Vous pouvez à nouveau appeler Time_nanosleep () en fonction de la valeur de retour pour continuer à dormir. Les exemples sont les suivants:

 <?php
$seconds = 2;
$nanoseconds = 0;

while (true) {
    $result = time_nanosleep($seconds, $nanoseconds);
    if ($result === true) {
        echo "Sommeil complet" . PHP_EOL;
        break;
    } elseif (is_array($result)) {
        echo "Le sommeil interrompu,temps restant:{$result['seconds']}Deuxième {$result['nanoseconds']}Nanosecondes" . PHP_EOL;
        $seconds = $result['seconds'];
        $nanoseconds = $result['nanoseconds'];
    } else {
        echo "Échec de la sommeil" . PHP_EOL;
        break;
    }
}
?>

Cette écriture garantit que le programme peut continuer à terminer le temps de sommeil prédéterminé après avoir été interrompu par un signal.

Exemples de scénarios d'utilisation combinés avec des demandes HTTP

Supposons que vous souhaitiez implémenter une fonction de limite de vitesse de demande, une pause pour 200 millisecondes entre chaque demande, vous pouvez envoyer une demande en conjonction avec Curl et utiliser Time_nanosleep () pour contrôler avec précision le temps d'intervalle. Voici l'exemple de code:

 <?php
$urls = [
    "https://gitbox.net/api/data1",
    "https://gitbox.net/api/data2",
    "https://gitbox.net/api/data3",
];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        echo "Échec de la demande:" . curl_error($ch) . PHP_EOL;
    } else {
        echo "La demande a réussi:" . substr($response, 0, 50) . "..." . PHP_EOL;
    }
    curl_close($ch);

    // pause 200 millisecondes
    time_nanosleep(0, 200000000);
}
?>

Ce code demande à son tour trois interfaces, s'arrêtant pour 200 millisecondes après chaque demande, évitant ainsi les demandes trop fréquentes.

Résumer

  • Time_nanosleep () vous permet de suspendre les programmes PHP avec des secondes et une précision nanoseconde.

  • Il est plus flexible que le sommeil traditionnel () et usleep () , et convient aux scénarios avec des exigences élevées pour la précision du contrôle du temps.

  • Faites attention à la gestion des interruptions du signal pour assurer la robustesse de la logique du programme.

  • Time_nanosleep () est une fonction très pratique lorsque la limitation de la vitesse, le contrôle d'intervalle ou la planification fine sont nécessaires.

En utilisant rationnellement Time_nanosleep () , vos applications PHP peuvent être plus précises et efficaces dans le contrôle du temps.