>  기사  >  PHP 프레임워크  >  Swoole 프로세스를 올바르게 종료하는 방법

Swoole 프로세스를 올바르게 종료하는 방법

PHPz
PHPz원래의
2023-03-27 15:29:061902검색

Swoole은 PHP 애플리케이션의 성능과 동시성 기능을 크게 향상시킬 수 있는 비동기 및 병렬 PHP 네트워크 프로그래밍 프레임워크입니다. Swoole을 사용하여 애플리케이션을 개발하는 과정에서 필연적으로 Swoole 프로세스를 종료해야 하는 상황에 직면하게 됩니다. 이 기사에서는 Swoole의 프로세스 관리 및 Swoole을 올바르게 종료하는 방법을 소개합니다.

1. Swoole의 프로세스 관리

Swoole에서는 SwooleProcess 클래스를 사용하여 하위 프로세스를 만들 수 있습니다. 하위 프로세스가 종료되면 상위 프로세스는 하위 프로세스를 적시에 재활용해야 합니다. 그렇지 않으면 시스템 리소스를 점유하고 프로그램 성능에 해를 끼치는 좀비 프로세스가 나타납니다.

Swoole에서는 다음 두 가지 방법으로 프로세스를 종료할 수 있습니다.

1. 종료 메소드 호출

Swoole에서는 종료 메소드를 호출하여 현재 프로세스를 종료할 수 있습니다. 다음은 간단한 예입니다.

$process = new Swoole\Process(function (Swoole\Process $process) {
    echo "Child process start" . PHP_EOL;
    sleep(10);
    echo "Child process end" . PHP_EOL;
    $process->exit(0); // 结束进程
});

$process->start();
swoole_process::wait(); // 回收子进程

자식 프로세스가 모든 비즈니스 로직을 실행한 후 종료 메소드가 호출되어 프로세스가 종료되고, 상위 프로세스는 swoole_process::wait() 메소드를 호출하여 하위 프로세스를 재활용합니다.

2. kill 메소드 호출

kill 메소드를 호출하여 지정된 프로세스를 종료할 수도 있습니다. 예는 다음과 같습니다.

$pid = $process->start();
Process::kill($pid, SIGTERM); // 结束进程

여기서는 지정된 프로세스의 PID를 kill 메소드에 전달하여 지정된 프로세스를 종료합니다.

2. Swoole을 올바르게 종료하는 방법

Swoole 프로세스를 올바르게 종료하려면 다음 두 가지 문제가 필요합니다.

1. 종료 신호를 수신하는 방법

Swoole에서는 기본적으로 프로세스가 어떤 신호도 처리하지 않습니다. 프로세스에 대한 신호 수신기를 등록해야 합니다.

다음은 Swoole 프로세스의 예입니다.

$server = new Swoole\Http\Server("127.0.0.1", 9501);

$server->on("start", function () {
    // 注册信号监听器
    $signalHandler = function ($signal) use ($server) {
        echo "Receive signal $signal" . PHP_EOL;

        // 等待所有Worker进程结束
        $server->shutdown();
    };

    Swoole\Process::signal(SIGTERM, $signalHandler);
    Swoole\Process::signal(SIGINT, $signalHandler);
});

$server->on("workerStart", function () {
    // 设置Work进程的异常处理函数
    set_exception_handler(function (Throwable $exception) {
        echo $exception->getMessage() . PHP_EOL;

        // 退出进程
        exit(1);
    });
});

$server->on("request", function ($request, $response) {
    $response->end("Hello Swoole\n");
});

$server->start();

위 코드에서는 프로세스에 대해 SIGTERM 및 SIGINT 두 신호에 대한 리스너를 등록했습니다. 이 두 신호가 수신되면 $server->shutdown이 실행됩니다. .() 메서드를 사용하여 서버 프로세스를 중지합니다. 또한 각 Worker 프로세스에는 예외 처리 기능도 설정합니다. Worker 프로세스의 코드에서 예외가 발생하면 예외 정보가 인쇄되고 프로세스가 종료됩니다.

2. 프로세스가 끝날 때까지 기다리는 방법

신호 리스너를 등록하여 종료 신호를 받은 후 프로세스를 종료하기 전에 모든 작업자 프로세스가 끝날 때까지 기다려야 합니다. 그렇지 않으면 작업자 프로세스가 계속 실행될 수 있습니다.

Swoole에서는 $serv->shutdown() 또는 $serv->stop() 메서드를 호출하여 모든 Worker 프로세스가 종료될 때까지 기다릴 수 있습니다.

$serv->shutdown()과 $serv->stop()의 차이점은 다음과 같습니다.

  • shutdown 메서드는 기본 프로세스의 모든 Worker 프로세스를 직접 종료하고 shutdown 메서드는 모든 Worker 프로세스가 종료될 때까지 기다립니다. 계속하기 전에 서버 프로세스를 종료하십시오.
  • stop 메서드는 작업자 프로세스와 협상하여 프로세스를 종료합니다. 각 작업자 프로세스는 종료 프로세스가 깨끗하고 완료되었는지 확인하기 위해 정리 작업(예: 타이머 지우기, 모든 이벤트 종료 등)을 수행합니다.

다음은 shutdown 메소드를 사용하여 Swoole 프로세스를 종료하는 예입니다.

$serv = new Swoole\WebSocket\Server("0.0.0.0", 9501);

$serv->on("Start", function () use ($serv) {
    // 注册信号监听器
    $signalHandler = function ($signal) use ($serv) {
        echo "Receive signal $signal" . PHP_EOL;

        // 停止Server
        $serv->shutdown();
    };

    Swoole\Process::signal(SIGTERM, $signalHandler);
    Swoole\Process::signal(SIGINT, $signalHandler);
});

$serv->on("workerStart", function () {
    // 设置Work进程的异常处理函数
    set_exception_handler(function (Throwable $exception) {
        echo $exception->getMessage() . PHP_EOL;

        // 退出进程
        exit(1);
    });
});

$serv->on("message", function ($serv, $frame) {
    $serv->push($frame->fd, "Hello Swoole");
});

$serv->start();

위 예에서는 서버 프로세스에 대해 SIGTERM 및 SIGINT 두 신호에 대한 리스너를 등록하고 종료 시 $serv-를 호출했습니다. 신호가 수신되었습니다. >shutdown() 메소드는 프로세스를 종료합니다.

Summary

Swoole에서는 프로세스를 올바르게 종료하는 것이 매우 중요한 주제입니다. 좀비 프로세스나 작업자 프로세스가 계속 실행되는 것을 방지하려면 Swoole 프로세스에 대한 신호 수신기를 등록하고 프로세스를 종료하기 전에 모든 작업자 프로세스가 끝날 때까지 기다려야 합니다. 동시에 예외가 발생할 때 프로세스가 시간 내에 종료되도록 각 작업자 프로세스에서 예외 처리 기능을 설정해야 합니다.

위 내용은 Swoole 프로세스를 올바르게 종료하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.