Position actuelle: Accueil> Derniers articles> Time_nanosleep Que faire s'il est interrompu par un signal d'interruption?

Time_nanosleep Que faire s'il est interrompu par un signal d'interruption?

gitbox 2025-05-27

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 .

Pourquoi est-il interrompu par le signal?

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.

Comment juger et récupérer?

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é.

Exemple de code complet

 <?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";
?>

Conseils supplémentaires

  • 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.