首頁  >  文章  >  php框架  >  swoole怎麼重啟

swoole怎麼重啟

尚
原創
2019-12-10 15:20:195412瀏覽

swoole怎麼重啟

官方說是可以平滑重啟所有的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn