Geschäftsinitialisierung

Manchmal müssen wir nach dem Start des Prozesses einige Geschäftsinitialisierungen durchführen. Diese Initialisierung wird im Lebenszyklus des Prozesses nur einmal ausgeführt, z. B. um einen Timer zu setzen oder eine Datenbankverbindung zu initialisieren. Im Folgenden werden wir dies erläutern.

Prinzip

Gemäß den Informationen im Ausführungsablauf lädt Webman nach dem Start des Prozesses die in config/bootstrap.php (einschließlich config/plugin/*/*/bootstrap.php) festgelegten Klassen und führt die Methode start der Klassen aus. In der Methode start können wir Geschäftscode hinzufügen, um die Geschäftsinitialisierung nach dem Start des Prozesses durchzuführen.

Ablauf

Angenommen, wir möchten einen Timer erstellen, der regelmäßig den aktuellen Speicherverbrauch des Prozesses meldet. Diese Klasse nennt sich MemReport.

Befehl ausführen

Führen Sie den Befehl php webman make:bootstrap MemReport aus, um die Initialisierungsdatei app/bootstrap/MemReport.php zu generieren.

Hinweis
Wenn Ihr Webman nicht webman/console installiert hat, führen Sie den Befehl composer require webman/console zur Installation aus.

Initialisierungsdatei bearbeiten

Bearbeiten Sie app/bootstrap/MemReport.php, der Inhalt sollte ungefähr wie folgt aussehen:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

class MemReport implements Bootstrap
{
    public static function start($worker)
    {
        // Ist es eine Kommandozeilenumgebung?
        $is_console = !$worker;
        if ($is_console) {
            // Wenn Sie nicht möchten, dass diese Initialisierung in der Kommandozeilenumgebung ausgeführt wird, geben Sie hier einfach zurück
            return;
        }

        // Alle 10 Sekunden ausführen
        \Workerman\Timer::add(10, function () {
            // Zur Vereinfachung der Demonstration verwenden wir die Ausgabe anstelle des Meldungsprozesses
            echo memory_get_usage() . "\n";
        });

    }

}

Hinweis
Bei der Verwendung der Kommandozeile wird das Framework auch die in config/bootstrap.php konfigurierten start-Methoden ausführen. Wir können durch Überprüfung, ob $worker null ist, feststellen, ob es sich um eine Kommandozeilenumgebung handelt, und dann entscheiden, ob der Geschäftscode zur Initialisierung ausgeführt werden soll.

Konfiguration beim Prozessstart

Öffnen Sie config/bootstrap.php und fügen Sie die MemReport-Klasse zu den Startobjekten hinzu.

return [
    // ...hier wurden andere Konfigurationen weggelassen...

    app\bootstrap\MemReport::class,
];

So haben wir einen Geschäftsinitialisierungsprozess abgeschlossen.

Ergänzende Hinweise

Die benutzerdefinierten Prozesse** werden ebenfalls nach dem Start des Prozesses die in config/bootstrap.php konfigurierten start-Methoden ausführen. Wir können durch $worker->name feststellen, um welchen Prozess es sich handelt, und durch $worker->id herausfinden, welcher Prozess es ist, um dann zu entscheiden, ob wir den Geschäftscode zur Initialisierung in diesem Prozess ausführen. Wenn wir beispielsweise nur im 0. Prozess von Webman ausführen möchten, könnte der Inhalt von MemReport.php wie folgt aussehen:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

class MemReport implements Bootstrap
{
    public static function start($worker)
    {
        // Ist es eine Kommandozeilenumgebung?
        $is_console = !$worker;
        if ($is_console) {
            // Wenn Sie nicht möchten, dass diese Initialisierung in der Kommandozeilenumgebung ausgeführt wird, geben Sie hier einfach zurück
            return;
        }

        // Nur im 0. Prozess von Webman ausführen
        if ($worker->name != 'webman' && $worker->id != 0) {
            return;
        }

        // Alle 10 Sekunden ausführen
        \Workerman\Timer::add(10, function () {
            // Zur Vereinfachung der Demonstration verwenden wir die Ausgabe anstelle des Meldungsprozesses
            echo memory_get_usage() . "\n";
        });

    }

}