swoole reibungsloser Neustart
In swoole können wir verschiedene Signale an den Hauptprozess senden, und der Hauptprozess empfängt sie Entsprechend werden unterschiedliche Signaltypen verarbeitet. Zum Beispiel unterbricht das folgende
SIGTERM, ein elegantes Beendigungssignal, den Prozess, nachdem die Ausführung des aktuellen Programms abgeschlossen ist, anstatt den Prozess direkt abzubrechen (empfohlenes Lernen: Swoole-Video-Tutorial )
SIGUSR1, startet alle Worker-Prozesse reibungslos neu
SIGUSR2, startet alle Task-Prozesse reibungslos neu
Wenn wir den Server neu starten möchten, müssen wir nur das SIGUSR1-Signal an den Hauptprozess senden.
Das Prinzip des reibungslosen Neustarts besteht darin, dass der Hauptprozess ein sicheres Exit-Signal an einen untergeordneten Prozess sendet, wenn er das SIGUSR1-Signal empfängt wird nicht direkt Der Worker-Prozess wird beendet, sondern wartet darauf, dass der untergeordnete Prozess die Verarbeitung der anstehenden Arbeit abgeschlossen hat, lässt ihn dann glorreich „in den Ruhestand gehen“ und startet schließlich einen neuen untergeordneten Prozess (Neuladen des neuen PHP-Programmcodes).
Senden Sie dann den Befehl „Ruhestand“ an andere untergeordnete Prozesse und starten Sie so alle untergeordneten Prozesse nacheinander neu.
Uns ist aufgefallen, dass ein reibungsloser Neustart tatsächlich bedeutet, die alten untergeordneten Prozesse nacheinander beenden zu lassen und den neuen Prozess neu zu erstellen. Um die Benutzer während des reibungslosen Neustarts nicht zu beeinträchtigen, ist es erforderlich, dass benutzerbezogene Statusinformationen nicht im Prozess gespeichert werden. Das heißt, der Geschäftsprozess sollte zustandslos sein, um Informationsverluste aufgrund des Prozessabbruchs zu vermeiden.
Es fühlt sich sehr gut an, um neu zu starten, ist einfach ein Signal an den Hauptprozess zu senden.
Das Ideal ist voll, die Realität jedoch nicht.
In swoole ist ein Neustart nur für Dateien wirksam, die geladen werden, nachdem der Worker-Prozess gestartet wurde! Was bedeutet das? Es bedeutet, dass ein Neustart nur für Dateien sinnvoll ist, die nach dem onWorkerStart-Rückruf geladen werden. Wenn Sie möchten, dass eine Datei, die vor dem Start des Worker-Prozesses in den Speicher geladen wurde, wieder wirksam wird, können Sie nur den Server herunterfahren und neu starten.
Nachdem wir so viel gesagt haben, schreiben wir ein Beispiel, um zu sehen, wie das SIGUSR1-Signal an den Hauptprozess gesendet wird, um den Worker-Prozess effektiv neu zu starten.
Zuerst erstellen wir eine Testklasse, um die Daten des onReceive-Rückrufs zu verarbeiten. Warum sollten wir das onReceive-Rückrufgeschäft herausnehmen und separat schreiben?
<?php class Test { public function run($data) { echo $data; } }
In der Test::run-Methode besteht unser erster Schritt lediglich darin, die von swoole_server empfangenen Daten wiederzugeben.
Im aktuellen Verzeichnis erstellen wir eine swoole_server-Klasse NoReload.php
<?php require_once("Test.php"); class NoReload { private $_serv; private $_test; /** * init */ public function __construct() { $this->_serv = new Swoole\Server("127.0.0.1", 9501); $this->_serv->set([ 'worker_num' => 1, ]); $this->_serv->on('Receive', [$this, 'onReceive']); $this->_test = new Test; } /** * start server */ public function start() { $this->_serv->start(); } public function onReceive($serv, $fd, $fromId, $data) { $this->_test->run($data); } } $noReload = new NoReload; $noReload->start();
Besondere Erinnerung: Wenn wir swoole_server initialisieren, schreiben wir es in den Namespace
new Swoole\Server
Dieser Schreibstil entspricht dem Unterstreichungsschreiben.
new swoole_server
Außerdem werfen wir einen Blick auf die Codelogik des Servers: require_once Test.php vor der Klassendefinition, initialisieren When Beim Einrichten eines Worker-Prozesses wurde die NoReload::onReceive-Methode als onReceive-Rückruf von swoole_server registriert und die im onReceive-Rückruf empfangenen Daten wurden zur Verarbeitung an die Test::run-Methode übergeben.
Das obige ist der detaillierte Inhalt vonSo starten Sie Swoole reibungslos neu. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!