Бизнес-инициализация
Иногда нам нужно выполнить бизнес-инициализацию после запуска процесса, которая будет выполняться только один раз в течение жизненного цикла процесса, например, установить таймер после запуска процесса или инициализировать подключение к базе данных. Ниже мы расскажем об этом подробнее.
Принцип
В соответствии с объяснением в процессе выполнения, 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";
});
}
}