Geschäftsinitialisierung

Manchmal müssen wir nach dem Start eines Prozesses einige Geschäftsinitialisierungen vornehmen. Diese Initialisierung wird nur einmal im Lebenszyklus des Prozesses ausgeführt, z. B. das Einrichten eines Timers nach dem Start des Prozesses oder das Initialisieren der Datenbankverbindung usw. Im Folgenden werden wir dies genauer erläutern.

Prinzip

Gemäß den Erläuterungen im Ausführungsprozess 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 start-Methode der Klasse aus. Wir können Geschäftslogik in die start-Methode einfügen, um die geschäftlichen Initialisierungsvorgänge nach dem Start des Prozesses abzuschließen.

Ablauf

Angenommen, wir möchten einen Timer einrichten, um den aktuellen Speicherverbrauch des Prozesses zu melden. Diese Klasse wird 'MemReport' genannt.

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 das webman/console nicht 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 in etwa wie folgt aussehen:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

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

        // Alle 10 Sekunden ausführen
        \Workerman\Timer::add(10, function () {
            // Für eine einfachere Darstellung verwenden wir hier die Ausgabe anstelle des Meldungsvorgangs
            echo memory_get_usage() . "\n";
        });

    }

}

Hinweis
Wenn das Framework im Befehlszeilenmodus verwendet wird, wird auch die in config/bootstrap.php konfigurierte start-Methode ausgeführt. Wir können anhand von worker überprüfen, ob es sich um eine Befehlszeilenumgebung handelt, und so entscheiden, ob die Geschäftsinitialisierungslogik ausgeführt wird.

Konfiguration beim Start des Prozesses

Öffnen Sie config/bootstrap.php und fügen Sie die MemReport-Klasse zur Startsequenz hinzu.

return [
    // ... Andere Konfigurationen werden hier ausgelassen...

    app\bootstrap\MemReport::class,
];

Damit haben wir einen Geschäftsinitialisierungsprozess abgeschlossen.

Zusätzliche Hinweise

Benutzerdefinierte Prozesse führen nach dem Start ebenfalls die in config/bootstrap.php konfigurierte start-Methode aus. Wir können mit $worker->name feststellen, welcher Prozess aktuell läuft, und mit $worker->id die Prozessnummer ermitteln. Anschließend können wir entscheiden, ob Ihr Geschäftsinitialisierungscode in diesem Prozess ausgeführt werden soll. Sollen wir die Initialisierung beispielsweise nur in Webmans Prozess 0 ausführen, 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 Befehlszeilenumgebung?
        $is_console = !$worker;
        if ($is_console) {
            // Wenn Sie nicht möchten, dass diese Initialisierung in der Befehlszeilenumgebung ausgeführt wird, geben Sie hier einfach zurück
            return;
        }

        // Nur in Webmans Prozess 0 ausführen
        if ($worker->name != 'webman' || $worker->id != 0) {
            return;
        }

        // Alle 10 Sekunden ausführen
        \Workerman\Timer::add(10, function () {
            // Für eine einfachere Darstellung verwenden wir hier die Ausgabe anstelle des Meldungsvorgangs
            echo memory_get_usage() . "\n";
        });

    }

}