>  기사  >  PHP 프레임워크  >  Swoole을 원활하게 다시 시작하는 방법

Swoole을 원활하게 다시 시작하는 방법

(*-*)浩
(*-*)浩원래의
2019-12-06 09:58:133722검색

Swoole을 원활하게 다시 시작하는 방법

swoole Smooth restart

swoole에서는 다양한 신호를 메인 프로세스에 보낼 수 있으며, 메인 프로세스는 수신된 신호 유형에 따라 다르게 처리합니다. 예를 들어, 우아한 종료 신호인 다음

SIGTERM은 모든 작업자 프로세스를 직접 종료하는 대신 프로세스가 현재 프로그램 실행을 마친 후에 중단됩니다.

SIGUSR2는 모든 작업 프로세스를 원활하게 다시 시작합니다.

서버를 다시 시작하려면 SIGUSR1 신호를 메인 프로세스에 보내기만 하면 됩니다.

원활한 재시작의 원칙은 메인 프로세스가 SIGUSR1 신호를 받으면 메인 프로세스가 하위 프로세스에 안전한 종료 신호를 보내는 것입니다. 소위 안전한 종료는 메인 프로세스가 작업자를 직접 종료하지 않음을 의미합니다. 그러나 이 하위 프로세스가 현재 작업을 완료할 때까지 기다린 다음 영광스럽게 "은퇴"하고 마지막으로 새 하위 프로세스를 시작합니다(새 PHP 프로그램 코드 다시 로드).

그런 다음 "은퇴" 명령을 다른 하위 프로세스에 보내 모든 하위 프로세스를 차례로 다시 시작합니다.

원활한 재시작은 실제로 이전 하위 프로세스를 하나씩 종료하고 새 프로세스를 다시 생성하는 것을 의미한다는 것을 알아냈습니다. 원활한 재시작 중에 사용자에게 영향을 주지 않기 위해서는 사용자 관련 상태 정보가 프로세스에 저장되지 않아야 합니다. 즉, 프로세스 종료로 인한 정보 손실을 방지하기 위해 비즈니스 프로세스는 상태 비저장이어야 합니다.

기분이 매우 좋습니다. 다시 시작하려면 메인 프로세스에 신호를 보내기만 하면 됩니다.

이상은 매우 성취되지만 현실은 그렇지 않습니다.

swoole에서는 작업자 프로세스가 시작된 후에 로드된 파일에 대해서만 다시 시작이 유효합니다! 이는 무엇을 의미합니까? onWorkerStart 콜백 이후에 로드된 파일에 대해서만 다시 시작이 의미가 있음을 의미합니다. 작업자 프로세스가 시작되기 전에 메모리에 로드된 파일을 다시 적용하려면 서버를 종료하고 다시 시작하기만 하면 됩니다.

자세히 설명했으니, 작업자 프로세스를 효과적으로 다시 시작하기 위해 SIGUSR1 신호를 메인 프로세스에 보내는 방법을 알아보는 예제를 작성해 보겠습니다.

먼저 onReceive 콜백 데이터를 처리하기 위한 테스트 클래스를 만듭니다. 왜 onReceive 콜백 비즈니스를 꺼내서 별도로 작성해야 할까요?

<?php

class Test
{
    public function run($data)
    {
        echo $data;
    }
}

Test::run 메소드에서 첫 번째 단계는 swoole_server에서 수신한 데이터를 에코하는 것입니다.

현재 디렉토리에 swoole_server 클래스 NoReload.php를 생성합니다

<?php
require_once("Test.php");
class NoReload
{
    private $_serv;
    private $_test;
    /**
     * init
     */
    public function __construct()
    {
        $this->_serv = new Swoole\Server("127.0.0.1", 9501);
        $this->_serv->set([
            &#39;worker_num&#39; => 1,
        ]);
        $this->_serv->on(&#39;Receive&#39;, [$this, &#39;onReceive&#39;]);
        $this->_test = new Test;
    }
    /**
     * start server
     */
    public function start()
    {
        $this->_serv->start();
    }
    public function onReceive($serv, $fd, $fromId, $data)
    {
        $this->_test->run($data);
    }
}
$noReload = new NoReload;
$noReload->start();

특별 알림: swoole_server를 초기화할 때 쓰기 방법은 네임스페이스 쓰기 방법입니다

new Swoole\Server
이 쓰기 스타일은 밑줄 쓰기 방법과 동일합니다. swoole이 맞습니다 두 가지 스타일의 작성이 모두 지원됩니다
new swoole_server

또한 서버의 코드 로직을 살펴보겠습니다. 클래스 정의 전에 require_once Test.php, 초기화 중에 Worker 프로세스를 설정하고 NoReload::를 등록했습니다. onReceive 메소드를 swoole_server의 onReceive 콜백으로 사용하면 onReceive 콜백에서 수신된 데이터가 처리를 위해 Test::run 메소드로 전달됩니다.

위 내용은 Swoole을 원활하게 다시 시작하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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