1. 程式人生 > >Swoole 理解manager進程和worker進程的啟動順序,以及演示如何停止或者重啟服務端。

Swoole 理解manager進程和worker進程的啟動順序,以及演示如何停止或者重啟服務端。

urn option die span spa actor reactor load ont

測試的代碼主要功能:開啟一個tcp服務器。然後設置了管理進程和工作進程start的回調進行更名。設置了pid_file保存了服務端啟動的mast進程。

<?php
//創建Server對象,監聽 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);
$serv->set(array(
    ‘max_request ‘ => 10, //reactor thread num
    ‘worker_num‘ => 4,    //worker process num
    ‘log_file‘ => ‘swoole.log‘,
    ‘pid_file‘ => ‘server.pid‘,
));



$serv->on(‘managerStart‘,function($serv){ swoole_set_process_name("managerprocess"); }); $serv->on(‘workerStart‘,function($serv, $worker_id){ if($worker_id >= $serv->setting[‘worker_num‘]) { swoole_set_process_name("workprocess_".($worker_id-$serv->setting[‘worker_num‘])); }
else { swoole_set_process_name("workprocess_{$worker_id}"); } }); $serv->on(‘start‘,function($serv){ echo "到這一步說明服務已經起來了,manager,work都已經回調start完成"; }); //監聽連接進入事件 $serv->on(‘connect‘, function ($serv, $fd) { echo "Client: Connect.\n"; }); //監聽數據接收事件 $serv->on(‘receive‘, function
($serv, $fd, $from_id, $data) { $serv->send($fd, "Server: ".$data); }); //監聽連接關閉事件 $serv->on(‘close‘, function ($serv, $fd) { echo "Client: Close.\n"; }); //啟動服務器 $serv->start();

開啟服務器後

技術分享圖片

查看進程

技術分享圖片

然後查看pid_file裏的mast進程id是否是1827,上圖所示。結果顯然是一致的

技術分享圖片

下面寫一個腳本去重啟和停止服務端。(原理就是給mast進程發送信號)

<?php
    $options  = ‘s‘;
    $command = getopt($options);
    $pidFile = ‘server.pid‘;
    if(isset($command[‘s‘])){
        if($command[‘s‘]==‘stop‘){
            stop();
        }else{
            reload();
        }
    }else{
        die("請輸入-s stop|reload");
    }

    function stop(){
        global $pidFile;
        if (file_exists($pidFile)) {
            $pid = file_get_contents($pidFile);

            if (!swoole_process::kill($pid, 0)) {
                echo "PID :{$pid} not exist \n";
                return false;
            }
            swoole_process::kill($pid);
            //等待5秒
            $time = time();
            $flag = false;
            while (true) {
                usleep(1000);
                if (!swoole_process::kill($pid, 0)) {
                    echo "server stop at " . date("y-m-d h:i:s") . "\n";
                    if (is_file($pidFile)) {
                        unlink($pidFile);
                    }
                    $flag = true;
                    break;
                } else {
                    if (time() - $time > 5) {
                        echo "stop server fail.try again \n";
                        break;
                    }
                }
            }
            return $flag;
        } else {
            echo "pid 文件不存在,請執行查找主進程pid,kill!\n";
            return false;
        }
    }

    function reload(){
        global $pidFile;
        if (file_exists($pidFile)) {
            $sig = SIGUSR1;
            $pid = file_get_contents($pidFile);
            if (!swoole_process::kill($pid, 0)) {
                echo "pid :{$pid} not exist \n";
                return;
            }
            swoole_process::kill($pid, $sig);
            echo "send server reload command at " . date("y-m-d h:i:s") . "\n";
        } else {
            echo "pid 文件不存在,請執行查找主進程pid,kill!\n";
        }
    }

先執行重啟

技術分享圖片

再查看進程

技術分享圖片

主進程還是1827,但是工作進程就被reload的了。

然後執行退出

技術分享圖片

查看進程確實不見了

Swoole 理解manager進程和worker進程的啟動順序,以及演示如何停止或者重啟服務端。