비즈니스 초기화
때때로 프로세스 시작 후 일부 비즈니스 초기화를 수행해야 합니다. 이 초기화는 프로세스 수명 주기 동안 한 번만 실행됩니다. 예를 들어 프로세스 시작 후 타이머를 설정하거나 데이터베이스 연결을 초기화하는 등의 작업이 있습니다. 아래에서 이를 설명하겠습니다.
원리
실행 흐름의 설명에 따르면, 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";
});
}
}