/** * 运行线程 */ public function run() { date_default_timezone_set('Asia/Shanghai'); // 保存一个副本 $this->mainSocket = $this->worker->mainSocket; // 改变当前工作目录 chdir(WORKERMAN_ROOT_DIR); // 重新载入一次配置 \Man\Core\Lib\Config::reload(); // 载入入口文件 require_once $this->worker->workerFile; // 入口文件类名 $class_name = basename($this->worker->workerFile, '.php'); // 实例化入口类 $worker = new $class_name($this->worker->serviceName); // 如果该worker有配置监听端口,则将监听端口的socket传递给子进程 if ($this->mainSocket) { $worker->setListendSocket($this->mainSocket); } // 使worker开始服务 $worker->start(); }
/** * 设置server信号处理函数 * @param null $null * @param int $signal * @return void */ public static function signalHandler($signal) { switch ($signal) { // 停止服务信号 case SIGINT: self::notice("Workerman is shutting down"); self::stop(); break; // 测试用 // 测试用 case SIGUSR1: break; // worker退出信号 // worker退出信号 case SIGCHLD: // 这里什么也不做 // self::checkWorkerExit(); break; // 平滑重启server信号 // 平滑重启server信号 case SIGHUP: Config::reload(); self::notice("Workerman reloading"); $pid_worker_name_map = self::getPidWorkerNameMap(); $pids_to_restart = array(); foreach ($pid_worker_name_map as $pid => $worker_name) { // 如果对应进程配置了不热启动则不重启对应进程 if (Config::get($worker_name . '.no_reload')) { // 发送reload信号,以便触发onReload方法 posix_kill($pid, SIGHUP); continue; } $pids_to_restart[] = $pid; } self::addToRestartPids($pids_to_restart); self::restartPids(); break; } }