비즈니스 초기화

때때로 프로세스 시작 후 일부 비즈니스 초기화를 수행해야 합니다. 이 초기화는 프로세스 수명 주기 동안 한 번만 실행됩니다. 예를 들어 프로세스 시작 후 타이머를 설정하거나 데이터베이스 연결을 초기화하는 등의 작업이 있습니다. 아래에서 이를 설명하겠습니다.

원리

실행 흐름의 설명에 따르면, 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";
        });

    }

}

提示
명령줄을 사용할 때, 프레임워크는 config/bootstrap.php 구성의 start 메서드도 실행합니다. 우리는 $worker가 null인지 여부를 통해 명령줄 환경인지 판단할 수 있으며, 따라서 비즈니스 초기화 코드를 실행할지 결정할 수 있습니다.

프로세스 시작 시 구성

config/bootstrap.php을 열어 MemReport 클래스를 시작 항목에 추가합니다.

return [
    // ...여기서 다른 구성은 생략됨...

    app\bootstrap\MemReport::class,
];

이렇게 하면 비즈니스 초기화 흐름을 완료했습니다.

추가 설명

사용자 정의 프로세스가 시작된 후에도 config/bootstrap.php 구성의 start 메서드가 실행됩니다. 우리는 $worker->name을 통해 현재 프로세스가 어떤 프로세스인지 판단할 수 있으며, 추가적으로 $worker->id를 통해 몇 번째 프로세스인지 판단한 후, 해당 프로세스에서 비즈니스 초기화 코드를 실행할지 결정할 수 있습니다. 예를 들어, webman의 0번 프로세스에서만 실행하기를 원한다면, 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;
        }

        // 오직 webman의 0번 프로세스에서만 실행
        if ($worker->name != 'webman' && $worker->id != 0) {
            return;
        }

        // 10초마다 한 번 실행
        \Workerman\Timer::add(10, function () {
            // 편의상 출력으로서 보고 과정을 대체합니다.
            echo memory_get_usage() . "\n";
        });

    }

}