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 nichtwebman/console
installiert hat, führen Sie den Befehlcomposer 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 inconfig/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";
});
}
}