공식적으로는 모든 작업자 및 태스크 프로세스를 원활하게 다시 시작할 수 있다고 합니다.
$swoole->reload() 또는 swoole_process::kill($master_pid, SIGUSR1)을 사용하거나 직접 kill할 수 있습니다. USR1 master_pid 등.
추천 학습: swoole 비디오 튜토리얼
간단한 테스트
1개의 작업자 프로세스와 1개의 태스크 프로세스가 있는 swoole_http_server를 열면 브라우저가 요청 내용은 단순한 절전 모드입니다. , 그리고 통과 슬립 함수는 이 요청을 처리하는 작업자가 작업 상태에 있음을 나타내고 슬립 기간 동안 다시 로드 작업을 수행해야 합니다.
Swoole 서버에 처음으로 요청이 시작되면 관리자 프로세스는 작업자에게 요청을 처리하도록 예약합니다. 그런 다음 작업자 처리의 휴면 기간 동안 다른 요청이 들어오면 관리자는 예약하지 않습니다. 작업자 프로세스는 여전히 첫 번째 요청을 처리 중이므로 유일한 서버에 대한 후속 요청입니다. 이는 간단한 테스트를 통해 확인할 수 있습니다.
http 요청은 아래로 간단히 라우팅됩니다. easyswoole 프레임워크가 사용되기 때문에 php easyswoole reload all 명령을 실행하면 실제로 kill -USR1 master_pid가 됩니다.
서버 구성
$swoole_server->set([ 'worker_num' => 1, 'task_worker_num' => 1, 'reload_async' => true, 'max
테스트 시작
1. 작업 로직은 작업자 프로세스에 작성됩니다
http 메서드
public function test() { $start = microtime(true); echo '请求开始时间:' . $start . PHP_EOL; echo 'pid: ' . getmypid() . PHP_EOL; sleep(30); # 这里睡眠脚本作测试 echo 'finish sleep' . PHP_EOL; $end = microtime(true); echo '请求结束时间:' . $end . PHP_EOL; $this->writeJson(0, round(($end - $start), 3)); }
Monitor onWorkerStart() 메서드
EventHelper::registerWithAdd(ServerManager::getInstance()->getMainEventRegister(),EventRegister::onWorkerStart,function (\swoole_server $server,$workerId){ if(PHP_OS != 'Darwin'){ $name = Config::getInstance()->getConf('SERVER_NAME'); if( ($workerId < Config::getInstance()->getConf('MAIN_SERVER.SETTING.worker_num')) && $workerId >= 0){ $type = 'Worker'; }else{ $type = 'TaskWorker'; } cli_set_process_title("{$name}.{$type}.{$workerId}"); } # 下面是打印测试的 if ($type == 'Worker') { echo "这个是reload worker的时间:" . microtime(true) . "\n"; } if ($type == 'TaskWorker') { echo "这个是reload TaskWorker的时间:" . microtime(true) . "\n"; } });
테스트 결과:
요청 시작 시간: 1566880257.9533 # 여기에서 http 요청 인터페이스는 test()
pid: 42108
TaskWorker를 다시 로드할 시간입니다: 1566880265.1501 # 태스크 담당자가 유휴 상태이고 작업이 없으므로 즉시 다시 로드할 수 있으므로 php easyswoole reload all을 실행하는 시간입니다. .
작업자 다시 로드 시간은 다음과 같습니다: 1566880275.1524 # 이것은 작업자의 다시 로드 시간입니다. sleep(30)이 test()에 있고 max_wait_time을 초과하기 때문에 아래쪽 계층은 작업자의 작업이 완료될 때까지 계속 기다리지 않습니다. 삭제된 기존 워커를 직접 종료했는데, 그 결과 'finish sleep'이 출력되지 않고 새로운 워커가 생성되었습니다.
# 그런데 왜 작업자를 다시 만드는 데 10초가 걸리나요? Max_wait_time이 5초로 설정되어 있나요? ? 이것은 제가 한 번도 알아내지 못했던 일입니다.
위 내용은 Swoole을 다시 시작하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!