Heim  >  Artikel  >  PHP-Framework  >  So starten Sie Swoole reibungslos neu

So starten Sie Swoole reibungslos neu

(*-*)浩
(*-*)浩Original
2019-12-06 09:58:133731Durchsuche

So starten Sie Swoole reibungslos neu

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([
            &#39;worker_num&#39; => 1,
        ]);
        $this->_serv->on(&#39;Receive&#39;, [$this, &#39;onReceive&#39;]);
        $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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn