Sanfte Neustartprinzip

Was ist ein sanfter Neustart?

Ein sanfter Neustart unterscheidet sich von einem normalen Neustart, da er es ermöglicht, den Dienst (in der Regel im Zusammenhang mit Kurzlink-Geschäften) ohne Beeinträchtigung der Benutzer neu zu starten, um das PHP-Programm neu zu laden und Aktualisierungen am Geschäftscode durchzuführen.

Ein sanfter Neustart wird in der Regel während der Aktualisierung oder Veröffentlichung einer Version angewendet und kann verhindern, dass es aufgrund von Codeveröffentlichungen, die einen Neustart des Dienstes erforderlich machen, zu temporären Dienstunterbrechungen kommt.

Hinweis
Windows-Systeme unterstützen keinen Reload.

Hinweis
Bei langfristigen Verbindungen (z. B. Websocket) werden die Verbindungen beim sanften Neustart des Prozesses getrennt. Die Lösung besteht darin, eine Architektur wie gatewayWorker zu verwenden, bei der eine Gruppe von Prozessen speziell dafür zuständig ist, die Verbindungen aufrechtzuerhalten, und die reloadable-Eigenschaft dieser Gruppe auf false gesetzt wird. Die Geschäftsanwendung startet eine andere Gruppe von Worker-Prozessen zur Verarbeitung, und die Gateway- und Worker-Prozesse kommunizieren über TCP miteinander. Wenn Änderungen an der Geschäftsanwendung erforderlich sind, müssen nur die Worker-Prozesse neu gestartet werden.

Einschränkungen

Hinweis: Nur Dateien, die im on{...} Callback geladen werden, werden nach einem sanften Neustart automatisch aktualisiert. Dateien, die direkt im Startskript geladen oder fest codierter Code sind, werden beim Reload nicht automatisch aktualisiert.

Der folgende Code wird nach dem Reload nicht aktualisiert

$worker = new Worker('http://0.0.0.0:1234');
$worker->onMessage = function($connection, $request) {
    $connection->send('hi'); // Fester Code unterstützt kein Hot Reload
};
$worker = new Worker('http://0.0.0.0:1234');
require_once __DIR__ . '/your/path/MessageHandler.php'; // Direkt im Startskript geladene Dateien unterstützen kein Hot Reload
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage']; // Angenommen, die Klasse MessageHandler hat eine onMessage-Methode

Der folgende Code wird nach dem Reload automatisch aktualisiert

$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) { // onWorkerStart ist der Callback, der nach dem Start des Prozesses ausgelöst wird
    require_once __DIR__ . '/your/path/MessageHandler.php'; // Dateien, die nach dem Start des Prozesses geladen werden, unterstützen Hot Reload
    $messageHandler = new MessageHandler();
    $worker->onMessage = [$messageHandler, 'onMessage'];
};

Nach Änderungen an MessageHandler.php führen Sie php start.php reload aus, um MessageHandler.php neu in den Speicher zu laden und die Geschäftslogik zu aktualisieren.

Hinweis
Der obige Code verwendet zur Vereinfachung die require_once-Anweisung. Wenn Ihr Projekt PSR-4-Autoloading unterstützt, müssen Sie die require_once-Anweisung nicht aufrufen.

Prinzip des sanften Neustarts

Workerman umfasst einen Hauptprozess und mehrere Unterprozesse. Der Hauptprozess überwacht die Unterprozesse, während die Unterprozesse die Verbindungen von Clients entgegennehmen und die gesendeten Anfragedaten verarbeiten und die Antworten an die Clients zurücksenden. Wenn der Geschäftscode aktualisiert wird, müssen wir tatsächlich nur die Unterprozesse aktualisieren, um die Aktualisierung des Codes zu erreichen.

Wenn der Hauptprozess von Workerman ein Signal für einen sanften Neustart erhält, sendet der Hauptprozess ein Sicherheitsausstiegs-Signal an einen der Unterprozesse (dies ermöglicht es dem entsprechenden Prozess, die aktuelle Anfrage abzuschließen, bevor er beendet wird). Wenn dieser Prozess beendet wird, erstellt der Hauptprozess einen neuen Unterprozess (dieser Unterprozess lädt den neuen PHP-Code) und sendet erneut einen Stoppbefehl an einen anderen alten Prozess. Auf diese Weise werden die Prozesse nacheinander neu gestartet, bis alle alten Prozesse ersetzt wurden.

Wir sehen, dass der sanfte Neustart tatsächlich darin besteht, die alten Geschäftsprozesse nacheinander zu beenden und dann nacheinander neue Prozesse zu erstellen. Um während des sanften Neustarts keine Auswirkungen auf die Benutzer zu haben, ist es erforderlich, dass die Prozesse keine benutzerbezogenen Statusinformationen speichern, d. h. es ist am besten, wenn die Geschäftsprozesse zustandslos sind, um zu vermeiden, dass Informationen durch den Prozessabschluss verloren gehen.