swoole Smooth restart
swoole에서는 다양한 신호를 메인 프로세스에 보낼 수 있으며, 메인 프로세스는 수신된 신호 유형에 따라 다르게 처리합니다. 예를 들어, 우아한 종료 신호인 다음
SIGTERM은 모든 작업자 프로세스를 직접 종료하는 대신 프로세스가 현재 프로그램 실행을 마친 후에 중단됩니다.
SIGUSR2는 모든 작업 프로세스를 원활하게 다시 시작합니다.
서버를 다시 시작하려면 SIGUSR1 신호를 메인 프로세스에 보내기만 하면 됩니다.
원활한 재시작의 원칙은 메인 프로세스가 SIGUSR1 신호를 받으면 메인 프로세스가 하위 프로세스에 안전한 종료 신호를 보내는 것입니다. 소위 안전한 종료는 메인 프로세스가 작업자를 직접 종료하지 않음을 의미합니다. 그러나 이 하위 프로세스가 현재 작업을 완료할 때까지 기다린 다음 영광스럽게 "은퇴"하고 마지막으로 새 하위 프로세스를 시작합니다(새 PHP 프로그램 코드 다시 로드).그런 다음 "은퇴" 명령을 다른 하위 프로세스에 보내 모든 하위 프로세스를 차례로 다시 시작합니다.
원활한 재시작은 실제로 이전 하위 프로세스를 하나씩 종료하고 새 프로세스를 다시 생성하는 것을 의미한다는 것을 알아냈습니다. 원활한 재시작 중에 사용자에게 영향을 주지 않기 위해서는 사용자 관련 상태 정보가 프로세스에 저장되지 않아야 합니다. 즉, 프로세스 종료로 인한 정보 손실을 방지하기 위해 비즈니스 프로세스는 상태 비저장이어야 합니다. 기분이 매우 좋습니다. 다시 시작하려면 메인 프로세스에 신호를 보내기만 하면 됩니다.이상은 매우 성취되지만 현실은 그렇지 않습니다.
swoole에서는 작업자 프로세스가 시작된 후에 로드된 파일에 대해서만 다시 시작이 유효합니다! 이는 무엇을 의미합니까? onWorkerStart 콜백 이후에 로드된 파일에 대해서만 다시 시작이 의미가 있음을 의미합니다. 작업자 프로세스가 시작되기 전에 메모리에 로드된 파일을 다시 적용하려면 서버를 종료하고 다시 시작하기만 하면 됩니다.자세히 설명했으니, 작업자 프로세스를 효과적으로 다시 시작하기 위해 SIGUSR1 신호를 메인 프로세스에 보내는 방법을 알아보는 예제를 작성해 보겠습니다.
먼저 onReceive 콜백 데이터를 처리하기 위한 테스트 클래스를 만듭니다. 왜 onReceive 콜백 비즈니스를 꺼내서 별도로 작성해야 할까요?<?php class Test { public function run($data) { echo $data; } }
현재 디렉토리에 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([ 'worker_num' => 1, ]); $this->_serv->on('Receive', [$this, 'onReceive']); $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();
new Swoole\Server
new swoole_server
위 내용은 Swoole을 원활하게 다시 시작하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!