Dieser Artikel vermittelt Ihnen relevantes Wissen über PHP und stellt vor allem die PHP-Prozesssignalverarbeitung im Detail vor. Ich hoffe, dass er für alle hilfreich ist.
Vor zwei Wochen hat mir mein Chef die Aufgabe zugewiesen, ein Signalüberwachungspaket zu schreiben. Da die Projekte unseres Unternehmens in Containern laufen, müssen sie jedes Mal, wenn sie online gehen, das Image neu verpacken und dann starten. Vor dem Neupacken sendet Dokcer zunächst ein Signal an den Container und wartet dann eine Zeitspanne (Standard 10 Sekunden), bevor es ein SIGKILL-Signal sendet, um den Container zu beenden Die Aufgabe des Prozesses besteht darin, Nachrichten in der Warteschlange kontinuierlich zu verbrauchen. Angenommen, Sie möchten jetzt online gehen und müssen den Container herunterfahren. Docker sendet ein Signal an den im Container ausgeführten Prozess und teilt ihm mit, dass ich Sie in 10 Sekunden herunterfahren werde Der Prozess wurde gerade aus der Warteschlange genommen, bevor die nachfolgende Logik innerhalb von 1 Sekunde ausgeführt wurde. Zu diesem Zeitpunkt geht die Nachricht verloren und es können fehlerhafte Daten generiert werden Der Hintergrund dieser Aufgabe, die durch das Signal überwacht werden muss, entscheidet, was als nächstes zu tun ist. Wenn in der oben genannten Situation der residente Prozess das von Docker gesendete Shutdown-Signal empfängt, kann der Prozess blockiert werden und in den Ruhezustand versetzt werden, bis der Container beendet wird. OK, nachdem wir den Hintergrund geklärt haben, stellen wir die Signale in PHP vor (ich werde später einen Artikel darüber zusammenstellen, wie man dieses Paket schreibt, und das Paket auf https://packagist.org/ veröffentlichen, damit es von Freunden verwendet werden kann, die es benötigen) [ Empfohlenes Lernen:
PHP-Video-Tutorial】
1. Welche Signale gibt es im Linux-Betriebssystem2. Häufige Signale
SIGQUIT | 2 | Beenden den Prozess (den Prozess unterbrechen) | Programmbeendigung (Unterbrechung, Signal, wird ausgegeben, wenn der Benutzer INTR-Zeichen eingibt (normalerweise Strg-C, |
---|---|---|---|
3 | Erstellen Sie eine CORE-Datei, um den Prozess zu beenden, und generieren Sie Eine CORE-Datei | Prozess und Generieren einer CORE-Datei SIGQUIT ähnelt SIGINT, wird jedoch durch das QUIT-Zeichen gesteuert (normalerweise Strg-,). Der Prozess generiert beim Beenden aufgrund des Empfangs von SIGQUIT eine Kerndatei. Es ähnelt einem Programmfehlersignal | |
8 | CORE-Datei erstellen (Gleitkomma-Ausnahme) | SIGFPE wird ausgegeben, wenn ein schwerwiegender Rechenoperationsfehler auftritt, sondern auch alle anderen arithmetischen Fehler wie Überlauf und Division durch 0 | |
9 | Beenden Sie den Prozess (Töten Sie den Prozess) | SIGKILL wird verwendet, um die Ausführung des Programms sofort zu beenden. Dieses Signal kann nicht blockiert oder verarbeitet werden und ignoriert | Beenden Sie den Prozess (Timer läuft ab)SIGALRM-Uhrzeitsignal, das die tatsächliche Zeit oder den Uhrzeitalarm berechnet. Die Funktion verwendet dieses Signal |
SIGTERM | 15 | , um den Prozess zu beenden (Software-Beendigungssignal) | SIGTERM Programmende (Beenden, Signal, im Gegensatz zu SIGKILL kann dieses Signal blockiert und verarbeitet werden. Es wird normalerweise verwendet, um das Programm selbst anzufordern. Beenden Sie es normal. Der Shell-Befehl kill generiert dieses Signal standardmäßig |
SIGCHLD | 17 | Ignorieren Sie das Signal (benachrichtigen Sie den übergeordneten Prozess, wenn der untergeordnete Prozess stoppt oder beendet wird) | SIGCHLD Wenn der untergeordnete Prozess endet, empfängt der übergeordnete Prozess dieses Signal. |
SIGVTALRM | 26 |
Beenden Sie den Prozess (der virtuelle Timer läuft ab). ) |
SIGVTALRM virtuelles Taktsignal Ähnlich wie SIGALRM, berechnet jedoch die vom Prozess belegte CPU-Zeit ist bereit und Ein-/Ausgabevorgänge können beginnen |
2. Funktionen für die Signalverarbeitung in PHP Erweiterung)Das Folgende ist eine detaillierte Einführung in mehrere Methoden, die ich in dieser Aufgabe verwendet habe:declareDie Declare-Struktur wird verwendet, um die Ausführungsanweisungen eines Codeabschnitts festzulegen. Die Syntax von „declare“ ähnelt anderen Flusskontrollstrukturen. Mit dem Direktiventeil können Sie das Verhalten des „declare“-Codesegments festlegen. Derzeit werden nur zwei Befehle erkannt: Ticks und Encoding . Der Anweisungsteil im Deklarationscodesegment wird ausgeführt – wie er ausgeführt wird und welche Nebenwirkungen während der Ausführung auftreten, hängt von den in der Direktive festgelegten Anweisungen ab.TicksTick (Taktzyklus) ist ein Interpreter im Deklarationscode segment Der Wert des Ereignisses N, das jedes Mal auftritt, wenn N zeitgesteuerte Low-Level-Anweisungen ausgeführt werden, wird mit ticks=N im Direktiventeil der Deklaration angegeben. Nicht alle Anweisungen können zeitlich festgelegt werden. Im Allgemeinen sind sowohl bedingte Ausdrückeals auchParameterausdrücke nicht zeitgesteuert. Die Ereignisse, die in jedem Tick erscheinen, werden durch register_tick_function() angegeben. Beachten Sie, dass in jedem Tick mehrere Ereignisse erscheinen können. Ausführlichere Informationen finden Sie in der offiziellen Dokumentation: https://www.php.net/manual/zh/control-structures.declare.phpdeclare (directive) statement Nach dem Login kopieren pcntl_signal pcntl_signal, installieren Sie einen Signalprozessor <?php declare(ticks=1);//每执行一条时,触发register_tick_function()注册的函数 $a=1;//在注册之前,不算 function test(){//定义一个函数 echo "执行\n"; } register_tick_function('test');//该条注册函数会被当成低级语句被执行 for($i=0;$i<=2;$i++){//for算一条低级语句 $i=$i;//赋值算一条 } 输出:六个“执行” Nach dem Login kopieren Asynchrone Signalverarbeitung installierte Prozessor wird verwendet, um eine asynchrone Signalverarbeitung ohne Ticks zu ermöglichen (was viel zusätzlichen Overhead mit sich bringt). (PHP>=7.1)pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls = true ] ) : bool Nach dem Login kopieren |
Das obige ist der detaillierte Inhalt vonEin umfassender Überblick über die PHP-Prozesssignalverarbeitung in einem Artikel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!