WorkerMan::Worker类解析(4)
来源:互联网 发布:maven 打包 java文件 编辑:程序博客网 时间:2024/06/05 10:55
// 为一个新的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; } }
阅读全文
0 0
- WorkerMan::Worker类解析(4)
- WorkerMan::Worker类解析(1)
- WorkerMan::Worker类解析(2)
- WorkerMan::Worker类解析(3)
- WorkerMan::Timer解析
- Workerman
- Workerman
- workerman
- Workerman
- Spark Worker原理解析
- Worker::setProcessTitle()解析
- Worker::initId()解析
- C语言实现类workerman的功能
- Worker
- spark worker的原理和源码解析
- workerman 定时器
- workerman推送
- workerman开发
- 正则
- UiAutomator python+uiautomator 自动义测试框架
- 工具查看
- post请求传xml参数(KissXML 生成xml文件)
- 一年过去了,这家网站的流量竟然达到……
- WorkerMan::Worker类解析(4)
- 【codevs 2913】建筑抢修
- JAVA 编程思想第10章--内部类概要
- Android 消息机制——你真的了解Handler?
- The 3n + 1 problem
- PostGis部分点线相关函数测试
- jS中 用for循环进行对数组中数字升降排序
- 直接使用ip和数据库实例名登录PL/SQL
- Trafodion Troubleshooting-java.io.IOException: createTable exception