Бизнес-инициализация

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

Принцип

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

Процесс

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

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

Выполните команду php webman make:bootstrap MemReport для создания файла инициализации app/bootstrap/MemReport.php

Подсказка
Если у вас нет установленного 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 для определения, является ли это окружение командной строкой, и соответственно решить, нужно ли выполнять исходный код инициализации бизнеса.

Настройка запуска вместе с процессом

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

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

    app\bootstrap\MemReport::class,
];

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

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

Собственный процесс также выполнит метод start, указанный в config/bootstrap.php. Мы можем использовать переменную $worker->name для определения текущего процесса и решить, нужно ли выполнять ваш исходный код инициализации бизнеса. Например, если нам не нужно отслеживать процесс monitor, то содержание 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;
        }

        // Процесс monitor не выполняет таймер
        if ($worker->name == 'monitor') {
            return;
        }

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

    }

}