swoole怎么重啟

swoole怎么重啟

官方說是可以平滑重啟所有的worker和tasker進(jìn)程,可以通過

$swoole->reload(),或者swoole_process::kill($master_pid, SIGUSR1),或者直接kill -USR1 master_pid等等。

推薦學(xué)習(xí):?swoole視頻教程

簡單測試

開啟一個swoole_http_server,worker進(jìn)程和tasker進(jìn)程都為1個,然后瀏覽器發(fā)起一個http請求,請求的內(nèi)容只是簡單的sleep一下,通過sleep函數(shù),應(yīng)該是可以說明處理此請求的worker,是正在處于工作狀態(tài)的吧,然后在sleep期間,進(jìn)行reload操作。

當(dāng)?shù)谝淮伟l(fā)起一個請求到swoole server,manager進(jìn)程會將請求調(diào)度到worker去進(jìn)行處理,然后在worker處理的sleep期間,如果再有請求進(jìn)來,manager是不會將后續(xù)的請求調(diào)度給唯一的worker進(jìn)程,因為worker進(jìn)程還在忙碌處理第一個請求。這個可以通過簡單測試確認(rèn)。

http請求就是路由到下面的簡單方法。因為用的是easyswoole框架,執(zhí)行php easyswoole reload all命令,其實也就是kill -USR1 master_pid。

Server的配置

$swoole_server->set([     'worker_num' => 1,     'task_worker_num' => 1,     'reload_async' => true,     'max

開始測試

1、任務(wù)邏輯寫在worker進(jìn)程里面

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 '請求結(jié)束時間:' . $end . PHP_EOL;         $this->writeJson(0, round(($end - $start), 3));     }

監(jiān)控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";           }    });

測試結(jié)果:

請求開始時間:1566880257.9533? ? # 這里請求http接口,就是test()

pid: 42108

這個是reload TaskWorker的時間:1566880265.1501? ? # 這里是執(zhí)行 php easyswoole reload all 的時間,因為tasker空閑沒任務(wù),就馬上就行reload了。

這個是reload worker的時間:1566880275.1524? ? # 這個是worker的reload時間,因為在test()里面sleep(30),而且超過了max_wait_time,底層不會繼續(xù)等待worker的任務(wù)完成,直接把舊的worker結(jié)束掉,結(jié)果也沒有打印’finish sleep’,創(chuàng)建了新的worker。

# 但是為什么是10s才重新創(chuàng)建worker呢?max_wait_time設(shè)置為5s啊??這個是我一直想不明白的。

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊9 分享