Initialisation des affaires
Parfois, nous avons besoin d'effectuer une certaine initialisation des affaires après le démarrage du processus. Cette initialisation ne s'effectue qu'une seule fois dans le cycle de vie du processus, par exemple, configurer un minuteur après le démarrage du processus, ou initialiser des connexions à la base de données, etc. Nous allons expliquer cela ci-dessous.
Principe
Selon la flux d'exécution, webman chargera les classes définies dans config/bootstrap.php
(y compris config/plugin/*/*/bootstrap.php
) après le démarrage du processus, et exécutera la méthode start de ces classes. Nous pouvons ajouter notre code métier dans la méthode start pour réaliser l'initialisation des affaires après le démarrage du processus.
Processus
Supposons que nous souhaitons créer un minuteur pour rapporter régulièrement l'utilisation de la mémoire du processus actuel, nous appellerons cette classe MemReport
.
Exécution de la commande
Exécutez la commande php webman make:bootstrap MemReport
pour générer le fichier d'initialisation app/bootstrap/MemReport.php
Remarque
Si votre webman n'est pas installé avecwebman/console
, exécutez la commandecomposer require webman/console
pour l'installer.
Édition du fichier d'initialisation
Éditez app/bootstrap/MemReport.php
, le contenu est similaire à ce qui suit :
<?php
namespace app\bootstrap;
use Webman\Bootstrap;
class MemReport implements Bootstrap
{
public static function start($worker)
{
// Est-ce un environnement de ligne de commande ?
$is_console = !$worker;
if ($is_console) {
// Si vous ne voulez pas que cet initialisation s'exécute dans un environnement de ligne de commande, retournez ici directement
return;
}
// Exécute toutes les 10 secondes
\Workerman\Timer::add(10, function () {
// Pour des fins de démonstration, nous utilisons la sortie à la place du processus de rapport
echo memory_get_usage() . "\n";
});
}
}
Remarque
Lorsque vous utilisez la ligne de commande, le cadre exécutera également la méthode start configurée dansconfig/bootstrap.php
. Nous pouvons déterminer si nous sommes dans un environnement de ligne de commande en vérifiant si$worker
est null, et ainsi décider d'exécuter ou non le code d'initialisation des affaires.
Configuration du démarrage du processus
Ouvrez config/bootstrap.php
et ajoutez la classe MemReport
aux éléments de démarrage.
return [
// ...d'autres configurations sont omises ici...
app\bootstrap\MemReport::class,
];
Ainsi, nous avons complété un processus d'initialisation des affaires.
Remarques complémentaires
Le processus personnalisé exécutera également la méthode start configurée dans config/bootstrap.php
. Nous pouvons utiliser $worker->name
pour déterminer de quel processus il s'agit, et plus loin, nous pouvons utiliser $worker->id
pour savoir quel numéro de processus c'est, puis décider d'exécuter votre code d'initialisation des affaires dans ce processus. Par exemple, si nous voulons exécuter uniquement dans le processus 0 de webman, le contenu de MemReport.php
serait similaire à ce qui suit :
<?php
namespace app\bootstrap;
use Webman\Bootstrap;
class MemReport implements Bootstrap
{
public static function start($worker)
{
// Est-ce un environnement de ligne de commande ?
$is_console = !$worker;
if ($is_console) {
// Si vous ne voulez pas que cet initialisation s'exécute dans un environnement de ligne de commande, retournez ici directement
return;
}
// N'exécute que dans le processus 0 de webman
if ($worker->name != 'webman' && $worker->id != 0) {
return;
}
// Exécute toutes les 10 secondes
\Workerman\Timer::add(10, function () {
// Pour des fins de démonstration, nous utilisons la sortie à la place du processus de rapport
echo memory_get_usage() . "\n";
});
}
}