/** * 检查控制终端是否已经关闭, 如果控制终端关闭,则停止打印数据到终端 * @return void */ public static function checkTty() { // 已经重置了fd,就不检查终端是否关闭,因为不会打印东西到屏幕了 if (self::$hasResetStd) { return; } // 没开启debug不打印数据到屏幕,不检测终端是否关闭 if (!Config::get('workerman.debug')) { return; } // 检测终端是否关闭 if (!self::$terminalClosed && !@posix_ttyname(STDOUT)) { self::resetStdFd(true); // 日志 self::notice("terminal closed and reset workers fd"); // 获取所有子进程pid $all_worker_pid = self::getPidWorkerNameMap(); // 向所有子进程发送重置标准输入输出信号 foreach ($all_worker_pid as $pid => $worker_name) { // 发送SIGTTOU信号 posix_kill($pid, SIGTTOU); } // 设置标记 self::$terminalClosed = true; } }
/** * 停止服务 * @return void */ public static function stop() { // 如果没有子进程则直接退出 $all_worker_pid = self::getPidWorkerNameMap(); if (empty($all_worker_pid)) { exit(0); } // 标记server开始关闭 self::$serviceStatus = self::STATUS_SHUTDOWN; // killWorkerTimeLong 秒后如果还没停止则强制杀死所有进程 Lib\Task::add(self::KILL_WORKER_TIME_LONG, array('\\Man\\Core\\Master', 'stopAllWorker'), array(true), false); // 停止所有worker self::stopAllWorker(); }
/** * 检查是否有线程退出了 * @param thread $work */ public static function check($work) { self::$threadIsTerminated = false; if ($work->isTerminated()) { self::$threadIsTerminated = true; return true; } return false; }