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 daswebman/consolenicht installiert hat, führen Sie den Befehlcomposer require webman/consolezur 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 inconfig/bootstrap.phpkonfiguriertestart-Methode ausgeführt. Wir können anhand vonworkerü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";
});
}
}