En PHP, la fonction Time_nanosleep () est utilisée pour faire dormir le programme pendant une période spécifiée avec une précision nanoseconde. Il est très simple à utiliser, par exemple:
time_nanosleep(1, 500000000); // Dormir1.5Deuxième
Cependant, dans une utilisation réelle, Time_nanosleep () peut être interrompu par des signaux système (tels que les signaux d'interruption), ce qui a fait fin le sommeil tôt. Dans ce cas, la fonction renvoie un tableau contenant les secondes et les nanosecondes restantes, plutôt que Boolean True .
Dans les systèmes Linux ou Unix, les processus peuvent recevoir divers signaux (tels que Sigint, Sigterm, etc.), qui interrompra l'état de sommeil, ce qui fait revenir Time_nanosleep () . PHP lui-même ne réessaye pas automatiquement le sommeil, ce qui conduit à un temps de sommeil inexact.
Lorsque Time_nanosleep () est interrompu par le signal, il ne revient pas vrai , mais renvoie un tableau:
[
'seconds' => 剩余Deuxième数,
'nanoseconds' => 剩余纳Deuxième数,
]
Sur cette base, nous pouvons écrire une boucle pour assurer le temps de sommeil complet, c'est-à-dire:
function reliable_nanosleep(int $seconds, int $nanoseconds): void {
while (true) {
$result = time_nanosleep($seconds, $nanoseconds);
if ($result === true) {
// Le sommeil s'est terminé avec succès
break;
}
// Interrompu par signal,$result Comprend le temps restant
$seconds = $result['seconds'];
$nanoseconds = $result['nanoseconds'];
}
}
Cette fonction continue de réessayer le temps de sommeil restant jusqu'à ce que le sommeil complet soit terminé.
<?php
function reliable_nanosleep(int $seconds, int $nanoseconds): void {
while (true) {
$result = time_nanosleep($seconds, $nanoseconds);
if ($result === true) {
break;
}
$seconds = $result['seconds'];
$nanoseconds = $result['nanoseconds'];
}
}
// Exemple:Dormir2.3Deuxième
echo "开始Dormir\n";
reliable_nanosleep(2, 300000000);
echo "Dormir结束\n";
?>
Traitement du signal : si votre programme doit traiter les signaux, il est recommandé de définir la fonction de traitement du signal en combinaison avec pcntl_signal () pour gérer plus raisonnablement le comportement d'interruption.
Alternative : Si votre environnement système prend en charge Usleep () ou Sleep () , ils peuvent également être utilisés, mais ils ont une précision inférieure.
Pour plus d'informations liées à PHP, veuillez vous référer à Gitbox.net/PHP-DOCS pour des documents et des exemples détaillés.