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