官方說是可以平滑重啟所有的worker和tasker進程,可以透過
$swoole->reload(),或\swoole_process::kill($ master_pid, SIGUSR1),或直接kill -USR1 master_pid等等。
推薦學習: swoole影片教學
#簡單測試
開啟一個swoole_http_server,worker進程和tasker進程都為1個,然後瀏覽器發起一個http請求,請求的內容只是簡單的sleep一下,透過sleep函數,應該是可以說明處理此請求的worker,是正在處於工作狀態的吧,然後在sleep期間,進行reload操作。
當第一次發起一個請求到swoole server,manager進程會將請求調度到worker去進行處理,然後在worker處理的sleep期間,如果再有請求進來,manager是不會將後續的請求調度給唯一的worker進程,因為worker進程還在忙碌地處理第一個請求。這個可以用簡單測試確認。
http請求就是路由到下面的簡單方法。因為用的是easyswoole框架,執行php easyswoole reload all指令,其實也就是kill -USR1 master_pid。
Server的設定
$swoole_server->set([ 'worker_num' => 1, 'task_worker_num' => 1, 'reload_async' => true, 'max
開始測試
1、任務邏輯寫在worker進程裡面
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)); }
監控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
#這個
#這個是reload TaskWorker的時間:1566880265.1501 # 這裡是執行php easyswoole reload all 的時間,因為tasker空閒沒任務,就馬上就行reload了。
這個是reload worker的時間:1566880275.1524 # 這個是worker的reload時間,因為在test()裡面sleep(30),而且超過了max_wait_time,底層不會繼續等待worker的任務完成,直接把舊的worker結束掉,結果也沒有印出'finish sleep',創建了新的worker。
#### 但是為什麼是10s才重新建立worker呢? max_wait_time設定為5s啊? ?這是我一直想不明白的。 ###以上是swoole怎麼重啟的詳細內容。更多資訊請關注PHP中文網其他相關文章!