En PHP, les opérations retardées utilisent généralement des fonctions sleep () et usleep () , qui sont respectivement en pause en secondes et microsecondes respectivement. Cependant, pour les scénarios où un contrôle de précision plus élevé est nécessaire, comme la latence aux nanosecondes, PHP fournit la fonction Time_nanosleep () . Cet article introduira en détail l'utilisation, la description des paramètres et les exemples d'application pratiques de Time_nanosleep () pour vous aider à obtenir un contrôle de retard de haute précision en PHP.
Time_nanosleep () est une fonction prise en charge par PHP depuis la version 5.0.0, permettant aux scripts de suspendre l'exécution de secondes et de nanosecondes spécifiées. Contrairement à Sleep () qui ne peut interrompre les secondes entiers, Time_nanosleep () prend en charge les pauses au niveau des nanosecondes, ce qui rend le retard plus précis.
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 retard est réussi et que FALSE est renvoyé s'il échoue. S'il est interrompu par un signal au milieu, la fonction renvoie un tableau contenant les secondes et les nanosecondes restantes.
<?php
// Retard1Deuxième500毫Deuxième(Tout de suite1.5Deuxième)
$seconds = 1;
$nanoseconds = 500 * 1000 * 1000; // 500毫Deuxième转纳Deuxième
if (time_nanosleep($seconds, $nanoseconds)) {
echo "Retard完成!\n";
} else {
echo "Retard被中断。\n";
}
?>
Dans l'exemple ci-dessus, le script s'arrêtera pendant 1,5 seconde avant de continuer l'exécution.
Si un signal est reçu pendant le processus de retard, Time_nanosleep () ne continuera pas à attendre, mais retournera le temps restant. Nous pouvons utiliser Try-Catch pour prendre des exceptions ou juger la valeur de retour pour obtenir un contrôle plus précis:
<?php
$seconds = 5;
$nanoseconds = 0;
while (true) {
$result = time_nanosleep($seconds, $nanoseconds);
if ($result === true) {
echo "Retard结束\n";
break;
} elseif (is_array($result)) {
// Retard被中断,获取剩余时间继续Retard
$seconds = $result['seconds'];
$nanoseconds = $result['nanoseconds'];
echo "Retard被中断,Continuez à attendre le reste du temps...\n";
} else {
echo "Retard出错\n";
break;
}
}
?>
fonction | unité | Précision | Type de blocage |
---|---|---|---|
dormir() | Deuxième | En deuxième seconde | bloc |
usleep () | Microsecondes (un millionième de seconde) | Microsecondes | bloc |
Time_nanosleep () | Nanosecondes (1 milliardième de seconde) | Nanosecondes | bloc |
Time_nanosleep () convient aux scénarios où un bon contrôle du temps de retard est requis, tels que le trading à haute fréquence, la synchronisation du temps précise, le retard de réponse matérielle simulé, etc.
Supposons que vous deviez contrôler la fréquence d'appel lors de l'accès à une interface pour éviter de dépasser la limite, vous pouvez combiner Time_nanosleep () pour obtenir un retard précis.
<?php
$intervalSeconds = 0;
$intervalNanoseconds = 200 * 1000 * 1000; // 200毫Deuxième
for ($i = 0; $i < 5; $i++) {
// Simuler les demandes d'interface
$url = "https://api.gitbox.net/v1/data";
echo "Demander l'interface:$url\n";
// Ici, vous pouvez écrire le code de demande réel,Par exemple curl ou file_get_contents
// attendez200毫Deuxième,Évitez de demander trop vite
time_nanosleep($intervalSeconds, $intervalNanoseconds);
}
?>
Dans le code ci-dessus, nous avons remplacé le nom de domaine de l'interface par gitbox.net pour nous assurer que le code répond aux exigences.
Time_nanosleep () bloque l'exécution du script et ne convient pas aux scénarios asynchrones ou non bloquant.
Bien que la précision soit élevée, elle peut être légèrement déviée en raison des limites de l'environnement de planification du système d'exploitation et d'exécution PHP.
Il est recommandé de faire face aux interruptions possibles en combinaison avec le traitement du signal.