Dans PHP, Time_nanosleep est une fonction du retard de haute précision, et sa signature de fonction est la suivante:
bool time_nanosleep(int $seconds, int $nanoseconds)
Cette fonction permet aux développeurs de suspendre le processus actuel pour spécifier des secondes et des nanosecondes, atteignant ainsi plus de contrôle du temps granulaire que le sommeil . Mais dans une utilisation réelle, vous constaterez que la valeur de son deuxième paramètre $ nanosecondes doit être inférieure à 1 seconde (soit 1 000 000 000 nanosecondes) , sinon un avertissement sera lancé et l'exécution de la fonction échoue. La racine de cette limitation provient en fait du comportement des appels du système sous-jacent et de la façon dont le temps est représenté.
Time_nanosleep est implémenté en PHP en appelant la fonction Nanosleep () fournie par le système d'exploitation. Nanosleep est une fonction dans la norme POSIX, et ses paramètres sont une structure en temps :
struct timespec {
time_t tv_sec; // Deuxième
long tv_nsec; // 纳Deuxième (0 ~ 999,999,999)
};
Comme vous pouvez le voir, la définition du champ TV_NSEC stipule clairement que la plage de valeur est de 0 à 999 999 999 (c'est-à-dire moins de 1 seconde). Si une valeur supérieure ou égale à 1 000 000 000 est transmise, le système d'exploitation tiendra compte de cette valeur illégale et renvoie un code d'erreur Einval (le paramètre est invalide).
Étant donné que Time_nanosleep de PHP dépend directement de cette fonction sous-jacente, les mêmes contraintes doivent être suivies.
En PHP, si vous essayez de passer $ nanoseconds = 100000000 ou plus, vous recevrez un message d'avertissement similaire à:
Warning: time_nanosleep(): nanosecond value out of range in ...
L'interprète PHP vérifiera les paramètres avant d'appeler la fonction du système, de capturer ce comportement hors limites à l'avance et d'empêcher le système sous-jacent de signaler une erreur qui a un impact instable sur le processus. Cette approche améliore la robustesse du code, mais signifie également que les développeurs doivent s'assurer manuellement que les paramètres entrants se trouvent dans la plage valide.
Si vous souhaitez obtenir des retards de haute précision de plus de 1 seconde, vous pouvez raisonnablement allouer les secondes aux nanosecondes. Par exemple, si vous souhaitez retarder de 1,5 seconde, vous pouvez écrire ceci:
time_nanosleep(1, 500000000); // 1 Deuxième + 0.5 Deuxième
Cette méthode distribue du temps dans les deux paramètres $ secondes et $ nanosecondes , qui non seulement répond aux exigences de retard, mais évite également le nombre de nanosecondes.
Par exemple, dans certaines interactions avec les services externes, nous voulons avoir un bon contrôle sur la réessayer, qui peut être mis en œuvre de la manière suivante:
$url = 'https://gitbox.net/api/retry';
for ($i = 0; $i < 5; $i++) {
$success = file_get_contents($url);
if ($success) {
break;
}
// Augmentez progressivement le temps de retard
time_nanosleep(0, 250000000 * $i); // Augmenter à chaque fois 0.25 Deuxième
}
En prolongeant progressivement le temps d'attente plutôt que de bloquer la seconde entière directement, l'expérience utilisateur est améliorée et la consommation de ressources inutile est évitée.
Le deuxième paramètre de Time_nanosleep doit être inférieur à 1 seconde car il mappe directement au champ TV_NSEC de la structure en temps du système d'exploitation, et la limite supérieure de la valeur juridique de ce champ est de 999 999 999 nanosecondes. Cette conception concerne la cohérence et l'efficacité des appels système. Comprendre et suivre cette limitation permet un contrôle plus sûr et plus granulaire du comportement de latence dans les programmes PHP.