当前位置: 首页 > 后端技术 > PHP

swoole重启问题

时间:2023-03-30 01:48:53 PHP

简单探究一下swoole的热重启问题官方说可以顺利重启所有worker和tasker进程,通过$swoole->reload(),或者\swoole_process::kill($master_pid,SIGUSR1),或者直接kill-USR1master_pid等等。那我们就简单测试下swoole能否顺利重启。简单测试启动一个swoole_http_server,一个worker进程和一个tasker进程,然后浏览器发起http请求。请求的内容只是简单的睡觉。通过sleep函数,应该可以说明处理这个请求的worker处于工作状态,然后在sleep中进行reload操作。当第一次向swooleserver发起请求时,manager进程会将请求派发给worker处理,然后在worker休眠处理期间,如果有其他请求进来,manager不会派发后续请求到唯一的工作进程,因为工作进程仍在忙于处理第一个请求。这可以通过简单的测试来确认。http请求被简单地路由到下面。因为使用了easyswoole框架,执行phpeasyswoolereloadall命令,其实就是kill-USR1master_pid。服务器配置$swoole_server->set(['worker_num'=>1,'task_worker_num'=>1,'reload_async'=>true,'max_wait_time'=>5,]);开始测试1.任务逻辑写在进程中的workerhttp方法中publicfunctiontest(){$start=microtime(true);echo'请求开始时间:'.$开始。PHP_EOL;回声'pid:'。getmypid()。PHP_EOL;睡觉(30);#此处用于测试echo'finishsleep'的睡眠脚本。PHP_EOL;$end=微时间(真);echo'请求结束时间:'.$结束。PHP_EOL;$this->writeJson(0,round(($end-$start),3));}监听onWorkerStart()方法EventHelper::registerWithAdd(ServerManager::getInstance()->getMainEventRegister(),EventRegister::onWorkerStart,function(\swoole_server$server,$workerId){if(PHP_OS!='Darwin'){$name=Config::getInstance()->getConf('SERVER_NAME');if(($workerIdgetConf('MAIN_SERVER.SETTING.worker_num'))&&$workerId>=0){$type='工人';}else{$type='TaskWorker';}cli_set_process_title("{$name}.{$type}.{$workerId}");}#下面是打印测试if($type=='Worker'){echo"Thisisthetimetoreloadworker:".微时间(真)。"\n";}if($type=='TaskWorker'){echo"ThisisthetimetoreloadTaskWorker:".微时间(真)。"\n";}});测试结果:Requeststarttime:1566880257.9533#这里是请求http接口,是test()pid:42108这是reload的时间TaskWorker:1566880265.1501#这里是执行phpeasyswoolereload的所有时间,因为tasker是空闲且没有任务,它将立即重新加载。Thisisthereloadtimeoftheworker:1566880275.1524#这是worker的reload时间,因为test()中sleep(30),并且超过了max_wait_time,底层不会继续等待worker的任务来complete,直接结束旧的worker,但是结果并没有打印'finishsleep',而是创建了一个新的worker。#但是为什么重新创建worker需要10s?max_wait_time设置为5s??这是我一直想知道的事情。有人可以分析一下吗??困扰了很久。