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é avec webman/console, exécutez la commande composer 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 dans config/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";
        });

    }

}