Aktueller Standort: Startseite> Neueste Artikel> time_nanosleep was zu tun, wenn es durch ein Interrupt -Signal unterbrochen wird?

time_nanosleep was zu tun, wenn es durch ein Interrupt -Signal unterbrochen wird?

gitbox 2025-05-27

In PHP wird die Funktion time_nanosleep () verwendet, um das Programm für eine bestimmte Zeit mit Nanosekundengenauigkeit Schlaf zu machen. Zum Beispiel ist es sehr einfach zu verwenden:

 time_nanosleep(1, 500000000); // Schlafen1.5Zweite

Time_nanosleeep () kann jedoch durch Systemsignale (z. B. Interrupt -Signale) unterbrochen werden, wodurch der Schlaf früh endet. In diesem Fall gibt die Funktion ein Array zurück, das die verbleibenden Sekunden und Nanosekunden enthält, und nicht der booleschen True .

Warum wird es vom Signal unterbrochen?

In Linux- oder UNIX -Systemen können Prozesse verschiedene Signale (z. B. Sigint, Sigterm usw.) erhalten, die den Schlafzustand unterbrechen, wodurch Time_nanosleep () zurückkehrt. PHP selbst wiederholt den Schlaf nicht automatisch, was zu einer ungenauen Schlafzeit führt.

Wie kann man beurteilen und sich erholen?

Wenn time_nanoseep () durch das Signal unterbrochen wird, gibt es nicht wahr , sondern zurück, sondern ein Array:

 [
    'seconds' => 剩余Zweite数,
    'nanoseconds' => 剩余纳Zweite数,
]

Basierend darauf können wir eine Schleife schreiben, um die vollständige Schlafzeit zu gewährleisten, d. H.:

 function reliable_nanosleep(int $seconds, int $nanoseconds): void {
    while (true) {
        $result = time_nanosleep($seconds, $nanoseconds);
        if ($result === true) {
            // Schlaf erfolgreich abgeschlossen
            break;
        }
        // Durch Signal unterbrochen,$result Beinhaltet die verbleibende Zeit
        $seconds = $result['seconds'];
        $nanoseconds = $result['nanoseconds'];
    }
}

Diese Funktion wird die verbleibende Schlafzeit wiederholt, bis der vollständige Schlaf abgeschlossen ist.

Vollständiger Beispielcode

 <?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'];
    }
}

// Beispiel:Schlafen2.3Zweite
echo "开始Schlafen\n";
reliable_nanosleep(2, 300000000);
echo "Schlafen结束\n";
?>

Zusätzliche Ratschläge

  • Signalverarbeitung : Wenn Ihr Programm Signale verarbeiten muss, wird empfohlen, die Signalverarbeitungsfunktion in Kombination mit PCNTL_signal () einzustellen, um das Interrupt -Verhalten vernünftigerweise zu verwalten.

  • Alternative : Wenn Ihre Systemumgebung usleep () oder schlaf () unterstützt, können sie auch verwendet werden, aber sie haben eine geringere Präzision.


Weitere Informationen zu PHP-bezogenen Informationen finden Sie unter gitbox.net/php-docs für detaillierte Dokumente und Beispiele.