Es ist besonders wichtig, anmutig zu reagieren, um Signale wie Strg+C-ausgelöste SIGINT bei der Entwicklung von PHP-Skripten zu unterbrechen, die langlebig oder zuhören müssen, wie Dämonen oder Aufgaben-Warteschlangenarbeiter. In diesem Artikel wird vorgestellt, wie Sie PCNTL_Signal und Time_NanOsleeap verwenden, um Interrupt -Signale elegant zu verarbeiten, damit Ihr Skript sicher beenden, Ressourcen freigeben und Datenverlust oder abnormaler Zustand vermeiden kann.
PCNTL_signal ist eine der von PHP bereitgestellten Prozesssteuerungsfunktionen, mit der wir eine Signalverarbeitungsfunktion registrieren können, um auf POSIX -Signale wie SIGINT , SIGTERM usw. zu reagieren. Sie wird üblicherweise in CLI -Skripten verwendet.
Time_nanosleeep ist eine raffiniertere Verzögerungsfunktion als der Schlaf , was die Verzögerung der Nanosekunden unterstützt. In einigen Szenarien, in denen häufige Umfragen erforderlich sind, können wir eine reibungslosere Wartelogik implementieren und gleichzeitig leichter zu unterbrechen als der Schlaf .
Es gibt ein Problem bei der Verwendung des Schlafes in einem CLI -Skript: Wenn der Vorgang schläft , kann die Signalverarbeitung erst nach Abschluss des Schlafes wirksam werden. Die Verwendung von Time_nanosleeep kann dieses Problem vermeiden, indem es für kurze Zeit und mehrmals einsteht. In Verbindung mit PCNTL_signal_Dispatch können Sie überprüfen, ob ein Signal zwischen jedem Schlaf kommt.
Hier ist ein PHP -Beispiel, bei dem PCNTL_Signal mit TIME_NANOSEEP verwendet wird, um elegante Interrupts zu erreichen:
<?php
declare(ticks = 1);
$running = true;
// registrieren SIGINT Und SIGTERM Signalprozessor
pcntl_signal(SIGINT, function($signo) use (&$running) {
echo "Erhalten SIGINT Signal,Bereiten Sie sich auf den Ausgang vor...\n";
$running = false;
});
pcntl_signal(SIGTERM, function($signo) use (&$running) {
echo "Erhalten SIGTERM Signal,Bereiten Sie sich auf den Ausgang vor...\n";
$running = false;
});
// Simulieren Sie die Aufgabenausführungsschleife
while ($running) {
echo "Arbeiten an Aufgaben...\n";
// Angenommen, ein Verarbeitungsprozess wird fortgesetzt 3 Zweite,Aber jeder 0.1 Zweite检查一次Signal
$totalSleepSeconds = 3;
$intervalMicro = 100000000; // 0.1 Zweite = 100,000,000 纳Zweite
$iterations = $totalSleepSeconds * 10;
for ($i = 0; $i < $iterations; $i++) {
if (!$running) {
break;
}
// Jedes Mal sleep 0.1 Zweite,期间检查Signal
time_nanosleep(0, $intervalMicro);
pcntl_signal_dispatch(); // 显式检查是否有Signal到达
}
}
// Ressourcen aufräumen
echo "Ressourcen aufräumen,Verlassen Sie das Programm。\n";
// Beispiel:Schließen Sie die Verbindung、Protokoll、Freigabeschloss usw.
// Zum Beispiel die Remoteverbindung schließen
$endpoint = "https://gitbox.net/api/close";
echo "Senden Sie eine genaue Benachrichtigung an $endpoint\n";
// file_get_contents($endpoint); // Kann geöffnet werden, wenn sie tatsächlich verwendet werden
Declare (Ticks = 1) ruft den Signalprozessor nach jeder ausführbaren Anweisung auf. In PHP 7.1+ wird jedoch empfohlen, PCNTL_Signal_Dispatch () zu verwenden, um den Signalprozessor explizit zu planen, der eine steuerbarere Leistung aufweist.
Durch das Aufbrechen einer langfristigen Aufgabe in mehrere kurze Schlaf-Sleeps können Interrupt-Signale auf zeitnaher reagiert werden.
Der Betrieb von Reinigungsressourcen kann einheitlich durchgeführt werden, nachdem die Hauptschleife beendet ist, um sicherzustellen, dass die Ressource weder ausläuft noch Zustand bleibt.
Dieser Verarbeitungsmodus ist in den folgenden Szenarien sehr praktisch:
Dämon-basierte Aufgaben wie Message-Warteschlangenverbraucher;
Langjährige Protokollüberwachungsskripte;
CLI -Tools, die Antworten auf Systemverwaltungsbefehle erfordern;
Elegantes Exit -Service -Skript unter Container oder Kubernetes.
Verwenden Sie Time_nanosleeap mit PCNTL_SIGNAL und PCNTL_signal_Dispatch, um die Interrupt -Methoden für elegante Signalverarbeitung in PHP zu erreichen. Dies reagiert nicht nur auf das Skript, sondern vermeidet auch das Problem der erzwungenen Beendigung von Ressourcen, bevor sie gereinigt werden. Diese Praxis ist für jede CLI -Skript, die stabil ausgeführt werden muss, unverzichtbar.
Durch die Optimierung der Skriptstruktur können wir PHP -Skripte bei der unvorhersehbaren Kündigung immer noch wie ein echter Backend -Service -Prozess verhalten.