Исследуйте горячий перезапуск swool
Официально все рабочие и рабочие процессы могут быть плавно перезапущены с помощью
$swool – > перезагрузить () или \ swool? Процесс:: Убить ($master? PID, SIGUSR1) или напрямую убить – мастер usr1? PID и т. Д.
Давайте проверим, может ли swool плавно перезапуститься.
Простой тест
Открыть свул? HTTP? Сервер. Существует один рабочий процесс и один процесс задачи. Затем браузер инициирует HTTP – запрос. Содержание запроса-это всего лишь простой сон. С помощью функции сна он должен быть в состоянии показать, что работник, обрабатывающий запрос, находится в рабочем состоянии. Затем, во время сна, перезагрузите запрос.
Когда запрос впервые отправляется на сервер swool, процесс диспетчера запланирует отправку запроса работнику для обработки. Затем во время обработки рабочего режима в режиме ожидания, если поступит еще один запрос, менеджер не будет планировать последующий запрос для единственного рабочего процесса, поскольку рабочий процесс все еще занят обработкой первого запроса. Это может быть подтверждено простыми тестами.
HTTP-запросы-это простой способ маршрутизации. Потому что он использует фреймворк easyswool для выполнения команды PHP easyswool reload all, которая на самом деле является kill – usr1 master_pid.
Конфигурация сервера
$swoole_server->set([ 'worker_num' => 1, 'task_worker_num' => 1, 'reload_async' => true, 'max_wait_time' => 5, ]);
Начните тестирование
1. Логика задачи записана в рабочем процессе
Метод HTTP
public function test() { $start = microtime(true); Echo 'request start time:'. $start. Php_eol; echo 'pid: ' . getmypid() . PHP_EOL; Sleep (30); ා here is the sleep script for testing echo 'finish sleep' . PHP_EOL; $end = microtime(true); Echo 'request end time:'. $end. Php_eol; $this->writeJson(0, round(($end - $start), 3)); }
Контролируйте метод on worker start()
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}"); } #Here is the print test if ($type == 'Worker') { Echo "this is the time of reload worker:". Microtime (true). "\ n"; } if ($type == 'TaskWorker') { Echo "this is the time of reload taskworker:". Microtime (true). "\ n"; } });
Результаты испытаний:
Request start time: 1566880257.9533 ා here the HTTP interface is requested, which is test () pid: 42108 This is the time of reload taskworker: 1566880265.1501. This is the time to execute PHP easyswoole reload all. Because the Tasker is idle and has no task, reload will be done immediately. This is the reload worker time: 1566880275.1524 ා this is the reload time of the worker. Because sleep (30) in test () exceeds the max ﹣ wait ﹣ time, the bottom layer will not continue to wait for the worker's task to be completed, and the old worker will be finished directly. As a result, no 'finish sleep' will be printed, and a new worker will be created. #But why does it take 10s to recreate the worker? Max wait time is set to 5S?? This is something I have never understood.
Может ли великий Бог объяснить это?? Это было так давно.