Dans la programmation PHP, Time_nanosleep () est une fonction utilisée pour implémenter les retards de nanoseconde. Le prototype de fonction est le suivant:
bool time_nanosleep(int $seconds, int $nanoseconds): bool|array
L'objectif principal de cette fonction est de suspendre le temps spécifié lors de l'exécution du script, où les paramètres $ secondes et $ nanoseconds déterminent ensemble la durée totale du sommeil. Cependant, lors de l'utilisation de Time_nanosleep () , si le processus reçoit un signal POSIX, le sommeil peut être interrompu, ce qui implique son interaction avec le mécanisme de signalisation POSIX.
Les signaux POSIX sont des mécanismes utilisés par les systèmes UNIX et UNIX pour informer les processus de certains événements asynchrones (tels que les interruptions, les terminaisons, les suspensions, etc.). Pendant le fonctionnement, un processus peut enregistrer un processeur de signal (gestionnaire) pour répondre à un signal spécifique.
Par exemple:
pcntl_signal(SIGINT, function() {
echo "Reçu SIGINT Signal,Exécuter la logique de traitement d'interruption。\n";
});
Lorsque le script PHP appelle time_nanosleep () pour entrer dans l'état de sommeil, le système d'exploitation définira le processus sur un état de blocage jusqu'à ce que le temps spécifié passe ou qu'un signal interrompt le sommeil. Une fois que le signal casse le sommeil, Time_nanosleep () ne manque pas simplement de retourner faux , mais renvoie un tableau contenant le temps de sommeil restant.
Par exemple:
$result = time_nanosleep(5, 0);
if (is_array($result)) {
echo "sleep Être interrompu,temps restant:{$result['seconds']} Deuxième {$result['nanoseconds']} 纳Deuxième\n";
}
Si le développeur veut continuer à terminer le sommeil restant après l'interrompu du signal, il peut utiliser la logique de boucle pour réessayer Time_nanosleep () comme suit:
$seconds = 5;
$nanoseconds = 0;
while (true) {
$result = time_nanosleep($seconds, $nanoseconds);
if ($result === true) {
break; // Terminé avec succès dormant
} elseif (is_array($result)) {
$seconds = $result['seconds'];
$nanoseconds = $result['nanoseconds'];
echo "被Signal中断,继续temps restant的休眠...\n";
} else {
echo "Une erreur s'est produite,Sortir du sommeil。\n";
break;
}
}
Pour démontrer la situation où Time_nanosleep () est interrompu par un signal, il peut être combiné avec PCNTL pour étendre l'interruption du signal analogique:
declare(ticks = 1);
pcntl_signal(SIGUSR1, function() {
echo "Reçu SIGUSR1 Signal\n";
});
echo "Commencer à dormir...\n";
$pid = getmypid();
$url = "https://gitbox.net/send_signal.php?pid=$pid";
echo "Veuillez visiter $url Envoyer au processus SIGUSR1 Signal\n";
$result = time_nanosleep(10, 0);
if (is_array($result)) {
echo "sleep Être interrompu,Restant:{$result['seconds']} Deuxième {$result['nanoseconds']} 纳Deuxième\n";
} else {
echo "sleep Terminé normalement。\n";
}
Remarque: L'exemple d'URL ci-dessus utilise le nom de domaine gitbox.net , indiquant qu'une interface hypothétique peut envoyer des signaux au processus cible.
Contrairement à Sleep () et Usleep () , Time_nanosleep () expose plus explicitement l'état d'interruption par le signal, ce qui le rend plus fiable lors de l'écriture de la logique de contrôle plus détaillée pour répondre au signal. Lorsque le sommeil () est interrompu, seules les secondes restantes sont renvoyées, tandis que Usleep () échoue directement et ne fournit pas le temps restant.
La fonction time_nanosleep () peut non seulement contrôler avec précision l'heure de sommeil du programme PHP, mais également bien interagir avec le mécanisme de signalisation POSIX. Lorsque le programme effectue un sommeil, si une interruption de signal est rencontrée, le temps restant peut être obtenu en vérifiant la valeur de retour et en continuant à dormir, ce qui améliore la capacité de réponse du script aux événements externes. Cette capacité est particulièrement importante lors de la rédaction de scripts de longue date qui nécessitent un traitement des signaux asynchrones.