当前位置:   article > 正文

WorkerMan::Worker类解析(4)_kill_worker_timer_time

kill_worker_timer_time
    // 为一个新的stream绑定一个新的accept事件监听.
    public function resumeAccept()
    {
        // Register a listener to be notified when server socket is ready to read.
        if (self::$globalEvent && $this->_pauseAccept && $this->_mainSocket) {
            if ($this->transport !== 'udp') {
                self::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ, array($this, 'acceptConnection'));
            } else {
                // tcp可读事件监听(当有client连接上当前socket server时触发此事件,进行accpet操作).
                self::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ,
                    array($this, 'acceptUdpConnection'));
            }
            $this->_pauseAccept = false;
        }
    }

    // 绑定信号处理(主进程的核心就在于信号的处理,回调各种绑定函数).
    protected static function installSignal()
    {
        // stop 停止信号.
        pcntl_signal(SIGINT, array('\Workerman\Worker', 'signalHandler'), false);
        // graceful stop 平滑停止信号.
        pcntl_signal(SIGTERM, array('\Workerman\Worker', 'signalHandler'), false);
        // reload 重新加载信号.
        pcntl_signal(SIGUSR1, array('\Workerman\Worker', 'signalHandler'), false);
        // graceful reload 平滑加载信号.
        pcntl_signal(SIGQUIT, array('\Workerman\Worker', 'signalHandler'), false);
        // status worker状态信号.
        pcntl_signal(SIGUSR2, array('\Workerman\Worker', 'signalHandler'), false);
        // connection status 客户端链接状态信号.
        pcntl_signal(SIGIO, array('\Workerman\Worker', 'signalHandler'), false);
        // ignore 忽略的信号.
        pcntl_signal(SIGPIPE, SIG_IGN, false);
    }

    // 信号处理绑定的回调函数.
    public static function signalHandler($signal)
    {
        switch ($signal) {
            // Stop 停止.
            case SIGINT:
                self::$_gracefulStop = false;
                // 停止所有进程.
                self::stopAll();
                break;
            // Graceful stop 平滑停止.
            case SIGTERM:
                self::$_gracefulStop = true;
                // 停止所有进程.
                self::stopAll();
                break;
            // Reload worker子进程重新加载.
            case SIGQUIT:
            case SIGUSR1:
                if($signal === SIGQUIT){
                    // 平滑的停止
                    self::$_gracefulStop = true;
                }else{
                    // 直接停止.
                    self::$_gracefulStop = false;
                }
                self::$_pidsToRestart = self::getAllWorkerPids();
                self::reload();
                break;
            // Show status 状态.
            case SIGUSR2:
                // 将worker运行信息写入统计文件.
                self::writeStatisticsToStatusFile();
                break;
            // Show connection status 客户端连接.
            case SIGIO:
                self::writeConnectionsStatisticsToStatusFile();
                break;
        }
    }

    // 停止所有进程(由主进程触发给子进程).
    public static function stopAll()
    {
        // 标记当前状态为停止.
        self::$_status = self::STATUS_SHUTDOWN;
        // For master process.
        // 主进程处理逻辑.
        if (self::$_masterPid === posix_getpid()) {
            self::log("Workerman[" . basename(self::$_startFile) . "] stopping ...");
            // 获取所有子进程的pid.
            $worker_pid_array = self::getAllWorkerPids();
            // Send stop signal to all child processes.
            if (self::$_gracefulStop) {
                $sig = SIGTERM;
            } else {
                $sig = SIGINT;
            }
            foreach ($worker_pid_array as $worker_pid) {
                // 向子进程发送停止的信号.
                posix_kill($worker_pid, $sig);
                if(!self::$_gracefulStop){
                    // 强制杀死子进程.
                    Timer::add(self::KILL_WORKER_TIMER_TIME, 'posix_kill', array($worker_pid, SIGKILL), false);
                }
            }
            // Remove statistics file.
            // 移除统计文件.
            if (is_file(self::$_statisticsFile)) {
                @unlink(self::$_statisticsFile);
            }
        } // For child processes.
        else {
            // 子进程处理.
            // Execute exit.
            foreach (self::$_workers as $worker) {
                // 自己调用自己的停止方法.
                $worker->stop();
            }
            // 子进程如果强制退出则直接进入exit,否则会等待关闭所有连接然后exit.
            if (!self::$_gracefulStop || ConnectionInterface::$statistics['connection_count'] <= 0) {
                // 强制停止.
                self::$globalEvent->destroy();
                exit(0);
            }
        }
    }

    // 子进程执行的退出函数.
    public function stop()
    {
        // Try to emit onWorkerStop callback.
        // 如果绑定了停止的回调函数,优先执行回调函数.
        if ($this->onWorkerStop) {
            try {
                call_user_func($this->onWorkerStop, $this);
            } catch (\Exception $e) {
                self::log($e);
                exit(250);
            } catch (\Error $e) {
                self::log($e);
                exit(250);
            }
        }
        // Remove listener for server socket.
        // 移除子进程的socket server监听.
        $this->unlisten();
        // Close all connections for the worker.
        if (!self::$_gracefulStop) {
            // 强制断开所有客户端连接.
            foreach ($this->connections as $connection) {
                // TcpConnection::closr()
                $connection->close();
            }
        }
        // 清空绑定的回调函数.
        $this->onMessage = $this->onClose = $this->onError = $this->onBufferDrain = $this->onBufferFull = null;
        // Remove worker instance from self::$_workers.
        // 清空实例化的worker.
        unset(self::$_workers[$this->workerId]);
    }

    // 子进程取消socket server监听.
    public function unlisten() {
        $this->pauseAccept();
        if ($this->_mainSocket) {
            // 关闭监听.
            @fclose($this->_mainSocket);
            $this->_mainSocket = null;
        }
    }

    // 子进程暂停接收新的客户端连接.
    public function pauseAccept()
    {
        if (self::$globalEvent && $this->_mainSocket && false === $this->_pauseAccept) {
            // 删除事件绑定.
            self::$globalEvent->del($this->_mainSocket, EventInterface::EV_READ);
            $this->_pauseAccept = true;
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/309443
推荐阅读
相关标签
  

闽ICP备14008679号