Инициализация бизнеса

Иногда нам необходимо выполнить некоторые операции по инициализации бизнеса после запуска процесса. Эта инициализация выполняется только один раз в течение жизненного цикла процесса, например, установление таймера после запуска процесса или инициализация подключения к базе данных и т.д. Ниже мы объясним это.

Принцип

Согласно порядку выполнения, webman загружает классы, указанные в config/bootstrap.php (включая config/plugin/*/*/bootstrap.php), после запуска процесса и выполняет метод start этого класса. В методе start мы можем добавить бизнес-код, чтобы выполнить операции по инициализации бизнеса после запуска процесса.

Процесс

Предположим, мы хотим создать таймер для периодической отчетности о текущем использовании памяти процесса, этот класс назовем MemReport.

Выполнение команды

Выполните команду php webman make:bootstrap MemReport, чтобы сгенерировать файл инициализации app/bootstrap/MemReport.php.

Подсказка
Если ваш webman не установлен webman/console, выполните команду composer require webman/console, чтобы установить.

Редактирование файла инициализации

Редактируйте app/bootstrap/MemReport.php, содержание должно быть примерно следующим:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

class MemReport implements Bootstrap
{
    public static function start($worker)
    {
        // Является ли это командной строкой?
        $is_console = !$worker;
        if ($is_console) {
            // Если вы не хотите, чтобы эта инициализация выполнялась в командной строке, просто вернитесь здесь
            return;
        }

        // Выполнять каждые 10 секунд
        \Workerman\Timer::add(10, function () {
            // Для удобства демонстрации здесь используется вывод вместо процесса отчетности
            echo memory_get_usage() . "\n";
        });

    }

}

Подсказка
При использовании командной строки фреймворк также выполнит метод start, указанный в config/bootstrap.php, мы можем определить, является ли $worker null, чтобы судить, находимся ли мы в среде командной строки, тем самым решая, выполнять ли код инициализации бизнеса.

Конфигурация при запуске процесса

Откройте config/bootstrap.php и добавьте класс MemReport в список инициализации.

return [
    // ...здесь опущены другие конфигурации...

    app\bootstrap\MemReport::class,
];

Таким образом, мы завершили процесс инициализации бизнеса.

Дополнительные пояснения

Пользовательские процессы также выполнят метод start, указанный в config/bootstrap.php. Мы можем использовать $worker->name, чтобы определить, какой это процесс, а затем с помощью $worker->id определить, является ли это конкретным номером процесса, и решить, выполнять ли ваш код инициализации бизнеса в этом процессе. Например, если нам нужно, чтобы это выполнялось только в процессе с номером 0 в webman, содержимое MemReport.php будет выглядеть примерно так:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

class MemReport implements Bootstrap
{
    public static function start($worker)
    {
        // Является ли это командной строкой?
        $is_console = !$worker;
        if ($is_console) {
            // Если вы не хотите, чтобы эта инициализация выполнялась в командной строке, просто вернитесь здесь
            return;
        }

        // Выполнять только в процессе с номером 0 в webman
        if ($worker->name != 'webman' && $worker->id != 0) {
            return;
        }

        // Выполнять каждые 10 секунд
        \Workerman\Timer::add(10, function () {
            // Для удобства демонстрации здесь используется вывод вместо процесса отчетности
            echo memory_get_usage() . "\n";
        });

    }

}