php 多進程熱重啓

<?php

class test{
    private $son_num = 4;

    private $son_list = [];

    public function start()
    {
        for($i = 0;$i < $this->son_num;$i++){
            $this->fork();
        }

        //kill -10 的信號
        pcntl_signal(SIGUSR1, [$this, 'sigHandler'], false);
        //control + c 的信號
        pcntl_signal(SIGINT,[$this,'sigHandler'],false);

        while (1) {
            pcntl_signal_dispatch();
        }
    }

    public function sigHandler($sign){
        echo "接收到信號:{$sign}\n";
        switch($sign){
            case 10:
                foreach($this->son_list as $son_pid){
                    posix_kill($son_pid,SIGKILL);
                    unset($this->son_list[$son_pid]);
                    echo "已關閉子進程:{$son_pid}\n";
                    $this->fork();
                }
                break;
            case 2:
                foreach($this->son_list as $son_pid){
                    posix_kill($son_pid,SIGKILL);
                    unset($this->son_list[$son_pid]);
                    echo "已關閉子進程:{$son_pid}\n";
                }
                exit;
                break;
            default :
                echo "接收到未知信號:{$sign}\n";
                exit;
        }
    }

    public function fork()
    {
        $pid = pcntl_fork();
        if($pid > 0){
            $this->son_list[$pid] = $pid;
            echo posix_getpid()."創建子進程:{$pid}\n";
        }else if($pid < 0){
            die('創建子進程失敗!');
        }else{
            while(true){
                echo "啦啦啦,我是子進程:".posix_getpid()."\n";
                sleep(1000);
            }
            exit;
        }
    }

    public function sign(){
        pcntl_signal(SIGUSR1, [$this, 'sigHandler'], false);
    }
}

(new test)->start();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章