function my_onReceive(swoole_server $serv, $fd, $from_id, $rdata) { $data = unserialize($rdata); if (isset($data['cmd'])) { switch ($data['cmd']) { case 'get': $s = microtime(true); $res = $serv->taskwait($data, 0.5, 0); echo "use " . (microtime(true) - $s) * 1000 . "ms\n"; $serv->send($fd, PHP_EOL . "get " . $res['key'] . ": " . $res['val']); break; case "set": $serv->task($data, 0); $serv->send($fd, "OK\n"); break; case "del": $serv->task($data, 0); break; case "reload": break; default: echo "server:" . $data . PHP_EOL; } } }
public function onReceive(swoole_client $cli, $data) { Trace::debug("*********cli {$this->fd} receive lenght:" . strlen($data) . "."); false !== $this->serv->connection_info($this->fd) && $this->serv->send($this->fd, $this->cryptor->encrypt($data)); $this->lock = false; $this->send(); }
public function onReceive(swoole_server $server, $fd, $from_id, $data) { if (empty($data)) { // 发送数据给客户端,请求包错误 $data = array('code' => 500, 'msg' => '非法请求', 'data' => null); $server->send($fd, json_encode($data)); } //局域网管理 $udpClient = $server->connection_info($fd, $from_id); if ($udpClient['server_port'] == '9502') { $data = str_replace("\r\n\r\n", "", $data); switch ($data) { case 'stop': echo '服务器关闭: ' . date('Y-m-d H:i:s') . PHP_EOL; $server->shutdown(); $server->send($fd, '服务器关闭成功'); break; case 'reload': echo 'Worker进程重启: ' . date('Y-m-d H:i:s') . PHP_EOL; $server->reload(); $server->send($fd, '服务器Worker重启成功'); break; default: $server->send($fd, '非法请求'); break; } } else { $data = json_decode($data, true); echo $data['name'] . " say hello " . Test::WORD . "\n"; $server->send($fd, $data['name'] . " say hello " . Test::WORD); } }
function errorHandler() { if (!empty($this->current_fd)) { $rsp = Proxy::shutdown_handler(); $rsp && $this->serv->send($this->current_fd, $rsp); } }
public function onReceive(\swoole_server $server, $fd, $from_id, $data) { $data = trim($data); if ($data == 'Stop') { //停止 $server->shutdown(); $server->send($fd, 'success', $from_id); } else { if ($data == 'Stats') { //状态 $data = $server->stats(); $server->send($fd, json_encode($data), $from_id); } else { if ($data == 'Reload') { //重启 $server->reload(); $server->send($fd, 'success', $from_id); } else { if ($data == 'ResetTelnet') { //重置所有telnet链接 } else { $data = json_decode($data, true); if ($data['act'] == 'Telnet' && isset($data['ip']) && isset($data['cmd'])) { //执行命令 $service = TelnetEvent::getService($data['ip']); if ($service == null) { $result['code'] = 2; } else { if ($data['cmd'] > 0) { if (isset($data['arg'])) { $result['data'] = $service->exec($data['cmd'], $data['arg']); } else { $result['data'] = $service->exec($data['cmd']); } if ($result == null || $result['data'] == null) { $result = ['code' => 3]; } else { $result['code'] = 1; } } else { $service->getSwitch()->connect(); if ($service->getSwitch()->isConnect()) { $result['code'] = 1; } else { $result['code'] = 3; } } } $server->send($fd, json_encode($result), $from_id); } else { $server->send($fd, 'unknown command!', $from_id); } } } } } $server->close($fd); }
public function onReceive(swoole_server $serv, $fd, $from_id, $data) { $info = $serv->connection_info($fd, $from_id); if ($info['server_port'] == 9502) { $serv->send($fd, "welcom Admin \n"); } else { $serv->send($fd, 'Swoole:' . $data); } }
function message($fd, $code, $msg) { $this->serv->send($fd, json_encode(array('code' => $code, 'msg' => $msg))); echo "[-->{$fd}]\t{$code}\t{$msg}\n"; if ($code != 0) { $this->serv->close($fd); } return true; }
/** * 发送回应 * @param $fd * @param $code * @param $msg * @return bool */ protected function sendResult($fd, $code, $msg) { $this->serv->send($fd, $this->pack(array('code' => $code, 'msg' => $msg))); //打印日志 if (is_string($msg) and strlen($msg) < 128) { echo "[-->{$fd}]\t{$code}\t{$msg}\n"; } //错误时自动关闭连接 if ($code != 0) { $this->serv->close($fd); } return true; }
function onReceive($serv, $fd, $from_id, $data) { if (!isset($this->clients[$fd])) { $this->serv->send($fd, "backend server not connected. please try reconnect."); $this->serv->close($fd); } else { echo microtime() . ": client receive\n"; $backend_socket = $this->clients[$fd]['socket']; $backend_socket->send($data); echo microtime() . ": send to backend\n"; echo str_repeat('-', 100) . "\n"; } }
function onReceive($serv, $fd, $from_id, $data) { //没有空闲的数据库连接 if (count($this->idle_pool) == 0) { //等待队列未满 if (count($this->wait_queue) < $this->wait_queue_max) { $this->wait_queue[] = array('fd' => $fd, 'sql' => $data); } else { $this->serv->send($fd, "request too many, Please try again later."); } } else { $this->doQuery($fd, $data); } }
function my_onReceive(swoole_server $serv, $fd, $from_id, $data) { //var_dump($serv->connection_info($fd, $from_id)); //echo "worker_pid=".posix_getpid().PHP_EOL; //var_dump($fd, $from_id); $serv->send($fd, 'Swoole: ' . $data, $from_id); }
/** * listen on receive data * * @param \swoole_server $serv * @param $fd * @param $from_id * @param $data */ public function on_receive(\swoole_server $serv, $fd, $from_id, $data) { // format passed $data = str_replace(self::EOFF, '', $data); $data = unserialize($data); // check is signal for server shutdown if (!empty($data['shutdown']) || !empty($data['reload'])) { // try to clear timers $this->__clear_timer(); $send = !empty($data['shutdown']) ? $serv->shutdown() : $serv->reload(); $send = serialize($send); $send .= self::EOFF; $ends = $serv->send($fd, $send); if ($ends) { $serv->close($fd); } return; } // dont send back if (!empty($data['return']) && $data['return'] === FALSE) { $back = serialize(TRUE); $back .= self::EOFF; $serv->send($fd, $back); $serv->close($fd); } // now post data to a task $param = ['fd' => $fd, 'data' => $data]; $param = serialize($param); $param .= self::EOFF; // worker direct $this->on_task($serv, NULL, NULL, $param); return; }
function onReceive(swoole_server $serv, $fd, $reactor_id, $data) { $op = strtolower(strstr($data, ' ', true)); //出队 if ($op == 'pop') { if ($this->head_index >= $this->tail_index) { $serv->send($fd, 'ERR empty' . self::EOF); return; } $result = $this->leveldb->get('data_' . $this->head_index); if ($result) { $this->leveldb->delete('data_' . $this->head_index); $this->head_index++; $this->pop_count++; $this->leveldb->set('_head_index', $this->head_index); $serv->send($fd, 'OK ' . $result . self::EOF); } else { $serv->send($fd, 'ERR get() failed.' . self::EOF); } } elseif ($op == 'push') { $result = $this->leveldb->set('data_' . $this->tail_index, substr($data, 5, strlen($data) - 5 - strlen(self::EOF))); if ($result) { $this->tail_index++; $this->push_count++; $this->leveldb->set('_tail_index', $this->tail_index); $serv->send($fd, 'OK ' . self::EOF); } else { $serv->send($fd, 'ERR write to leveldb failed.' . self::EOF); } } elseif ($op == 'stats') { $serv->send($fd, 'OK ' . var_export(['head_index' => $this->head_index, 'tail_index' => $this->tail_index, 'push_count' => $this->push_count, 'pop_count' => $this->pop_count], true) . self::EOF); } else { $serv->send($fd, 'ERR unsupported command [' . $op . ']' . self::EOF); } }
/** * 发送回应 * @param $fd * @param $code * @param $msg * @return bool */ protected function sendResult($fd, $code, $msg, $data = null) { $array = array('code' => $code, 'msg' => $msg); if ($data) { $array['data'] = $data; } $this->serv->send($fd, $this->pack($array)); //打印日志 if (is_string($msg) and strlen($msg) < 128) { echo "[-->{$fd}]\t{$this->currentCommand}\t{$code}\t{$msg}\n"; } // //错误时自动关闭连接 // if ($code != 0) // { // $this->serv->close($fd); // } return true; }
public function onReceive(swoole_server $serv, $fd, $from_id, $data) { echo "Get Message From Client {$fd}:{$data}\n"; foreach ($serv->connections as $client) { if ($fd != $client) { $serv->send($client, $data); } } }
function response($respData, $code = 200) { if (!isset($this->headerInfo['Content-Type'])) { $this->headerInfo['Content-Type'] = 'text/html; charset=' . $this->charset; } $response = implode("\r\n", array('HTTP/1.1 ' . $code . ' ' . self::$HttpStatus[$code], 'Cache-Control: must-revalidate,no-cache', 'Content-Language: zh-CN', 'Server: swoole-' . SWOOLE_VERSION, 'Content-Type: ' . $this->headerInfo['Content-Type'], 'Content-Length: ' . strlen($respData), '', $respData)); $this->serv->send($this->currentFd, $response); //$this->serv->close($this->currentFd); }
/** * send message to client * @param $client_id * @param $content * @return bool */ public function send($client_id, $content) { if (is_callable([$this->handel, "beforeSend"])) { if (!$this->handel->beforeSend($client_id, $content)) { return; } } return $this->server->send($client_id, $content); }
public function onConnect(swoole_server $serv, $fd, $from_id) { //获取连接的客户端信息 $fdInfo = $serv->connection_info($fd); echo '<pre>'; print_r($fdInfo); echo '</pre>'; $serv->send($fd, "Welcome {$fd} Connect Server"); }
function onReceive(swoole_server $serv, $fd, $from_id, $data) { $this->count[$fd]++; echo "Client#{$fd} recv: {$data}\n"; if ($this->count[$fd] > 10) { $serv->close($fd); } else { $serv->send($fd, "hello client"); } }
function onReceive(\swoole_server $serv, $fd, $from_id, $data) { $this->fd = $fd; $_key = explode(' ', trim($data)); if (count($_key) != 3) { return; } //模调系统,自动创建接口 if ($_key[0] == 'GET') { $this->clientInfo = $serv->connection_info($fd); $key = $this->getInterfaceId($_key[1], $_key[2]); $this->serv->send($fd, strval($key)); } elseif ($_key[0] == 'CONFIG') { $key = $this->getConfig($_key[1], $_key[2]); $this->serv->send($fd, $key . self::EOF); } elseif ($_key[0] == 'REPORT') { $serverIp = $_key[1]; $serviceName = $_key[2]; } else { $this->serv->send($fd, "unkown" . self::EOF); } }
public function __construct() { $serv = new swoole_server("127.0.0.1", 9504); $serv->set(array('worker_num' => 1, 'task_worker_num' => 8, 'db_uri' => 'mysql:host=127.0.0.1;dbname=test', 'db_user' => 'root', 'db_passwd' => 'root', 'daemonize' => true)); $serv->on('Receive', function ($serv, $fd, $from_id, $data) { $result = $serv->taskwait($data); if ($result !== false) { list($status, $db_res) = explode(':', $result, 2); if ($status == 'OK') { $serv->send($fd, var_export(unserialize($db_res), true) . "\n"); } else { $serv->send($fd, $db_res); } } else { $serv->send($fd, "Error. Task timeout\n"); } }); $serv->on('Task', function ($serv, $task_id, $from_id, $sql) { static $link = null; if ($link == null) { $link = new PDO($serv->setting['db_uri'], $serv->setting['db_user'], $serv->setting['db_passwd']); if (!$link) { $link = null; $serv->finish("ER: connect database failed."); } } $result = $link->query($sql); if (!$result) { $serv->finish("ER: query error"); } $data = $result->fetchAll(); $serv->finish(serialize($data)); }); $serv->on('Finish', function ($serv, $data) { echo "AsyncTask[{$task_id}] Finish: {$data}" . PHP_EOL; }); $serv->start(); }
/** * 服务端接收数据 * * @param $serv swoole_server对象 * @param $fd 连接的描述符 * @param $from_id reactor的id,无用 * @param $data 接收数据 */ public function onReceive(swoole_server $serv, $fd, $from_id, $data) { //检测数据完整性 if (JsonProtocol::check($data) != 0) { return; } $data = JsonProtocol::decode($data); //接收参数 $class = $data['class']; $method = $data['method']; $params = $data['params']; // 判断类对应文件是否载入 if (!class_exists($class)) { $include_file = ROOT_DIR . "Server/{$class}.php"; if (is_file($include_file)) { require_once $include_file; } if (!class_exists($class)) { $code = 404; $msg = "class {$class} not found"; $result = array('code' => $code, 'msg' => $msg, 'data' => null); $serv->send($fd, JsonProtocol::encode($result)); } } // 调用类的方法 try { $ret = call_user_func_array(array(new $class(), $method), $params); // 发送数据给客户端,调用成功,data下标对应的元素即为调用结果 $serv->send($fd, JsonProtocol::encode($ret)); } catch (Exception $e) { // 发送数据给客户端,发生异常,调用失败 $code = $e->getCode() ? $e->getCode() : 500; $result = array('code' => $code, 'msg' => $e->getMessage(), 'data' => $e); $serv->send($fd, JsonProtocol::encode($result)); } }
public function __construct() { $serv = new swoole_server("127.0.0.1", 9502); $serv->set(array('worker_num' => 16, 'daemonize' => true)); $serv->on('connect', function ($serv, $fd) { echo "Client:Connect.\n"; }); $serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, $data); $serv->close($fd); }); $serv->on('close', function ($serv, $fd) { echo "Client: Close.\n"; }); $serv->start(); }
/** * 发送网络数据 * @param mixed $data 数据 * @param int $fd 链接标识符 * @return void */ public function send($data, $fd) { $this->server->send($fd, $data); /* if(isset($this->env["asyn_send_packet"])?$this->env["asyn_send_packet"]:false){ if(isset($this->server->worker_id)){ if(!$this->server->taskworker){ $this->task("send_to_client" , ["fd" => $fd,"data"=>$data]); }else{ $this->server->send($fd, $data); } }else{ $this->sendMessage("send_to_client",["fd" => $fd,"data"=>$data]); } }else{ if(isset($this->server->worker_id) && !$this->server->taskworker){ $this->server->send($fd, $data); }else{ $this->sendMessage("send_to_client" , ["fd" => $fd,"data"=>$data],false); } }*/ }
public function serverAction() { $server = new swoole_server("192.168.80.140", 9021, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); $setting = array('daemonize' => 0, 'reactor_num' => 2, 'worker_num' => 4, 'max_request' => 2000, 'backlog' => 128, 'open_cpu_affinity' => 1, 'open_tcp_nodelay' => 1, 'log_file' => '../log/swoole_test.log', 'heartbeat_check_interval' => 30, 'heartbeat_idle_time' => 60, 'dispatch_mode' => 2); $server->set($setting); var_dump($server->setting); $server->on("connect", function ($server, $fd) { #echo "connect\n"; }); $server->on("receive", function ($server, $fd, $from_id, $data) { $server->send($fd, 'Swoole: ' . $data); $server->close($fd); }); $server->on("close", function ($server, $fd) { #echo "close\n"; #$server->shutdown(); }); $server->start(); return false; }
/** * 启动接口服务,支持长链接 */ public function runServer() { $oldErrorHandler = set_error_handler(array(__CLASS__, 'myErrorHandler')); $config = DI()->config->get('app.Swoole.server'); $ip = isset($config['ip']) ? $config['ip'] : '127.0.0.1'; $port = isset($config['port']) ? $config['port'] : 9501; $workerNum = isset($config['worker_num']) ? $config['worker_num'] : 8; $serv = new swoole_server($ip, $port); $serv->set(array('worker_num' => $workerNum, 'daemonize' => true)); $serv->on('connect', function ($serv, $fd) { DI()->logger->debug('client connect in swoole'); }); $serv->on('receive', function ($serv, $fd, $fromId, $data) { $params = json_decode($data, TRUE); if (!is_array($params)) { $params = array(); } DI()->request = new PhalApi_Request($params); DI()->response = new Swoole_Response_Json(); try { $phalapi = new PhalApi(); $rs = $phalapi->response(); $apiRs = $rs->getResult(); $serv->send($fd, $rs->formatResult($apiRs)); } catch (Exception $ex) { echo $ex->getTraceAsString(); DI()->logger->error('exception in swoole', $ex->getMessage()); //TODO 通知管理员 } if (DI()->notorm) { DI()->notorm->disconnect(); } $serv->close($fd); }); $serv->on('close', function ($serv, $fd) { DI()->logger->debug('client close in swoole'); }); $serv->start(); }
/** * Finish事件处理task的处理结果 * 这里实现任务失败的机制 * @param \swoole_server $serv * @param type $task_id * @param type $data */ public function my_onFinish(\swoole_server $serv, $task_id, $data) { $is_send = 1; $rs = $data['rs']; // if (is_array($data['rs'])) { // // 失败了 // if ($rs['err_no'] > 0) { // $tid = $this->getTaskId('Retry'); // echo "faild tid: {$tid} \n"; // // $task_data['class'] = $rs['class']; // $task_data['param'] = $rs['param']; // $task_data['fd'] = $data['fd']; // $task_data['retry_cnt'] = $rs['retry_cnt']; // // if ($rs['retry_cnt'] < 3) { // $serv->task($task_data, $tid); // } else { // $is_send = 1; // echo "超过3次,需要报警! \n"; // } // } else { // // 第一次就成功了。 // $is_send = 1; // } // // $rs = json_encode($data['rs']); // } else { // $is_send = 1; // } // if ($is_send > 0) { $serv->send($data['fd'], $rs); // $serv->close($data['fd']);//服务端主动断开connection } else { echo 'errror'; } }
function broadcast(swoole_server $serv, $fd = 0, $data = "hello") { $start_fd = 0; echo "broadcast\n"; while (true) { $conn_list = $serv->connection_list($start_fd, 10); if ($conn_list === false) { break; } $start_fd = end($conn_list); foreach ($conn_list as $conn) { if ($conn === $fd) { continue; } $ret1 = $serv->send($conn, $data); //var_dump($ret1); //$ret2 = $serv->close($conn); //var_dump($ret2); } } }
function send($client_id, $data) { return $this->sw->send($client_id, $data); }
function StartServSock($RunServer) { cli_set_process_title(SuperProcessName); //这边其实也是也是demon进程 $serv = new swoole_server(uniSockPath, 0, SWOOLE_BASE, SWOOLE_UNIX_STREAM); //维持一个动态数组 实现动态监控server 包含了php的启动路径和停止路径 array('php'=>,'name'=) $serv->runServer = $RunServer; $serv->set(array('worker_num' => 1, 'daemonize' => true)); $serv->on('WorkerStart', function ($serv, $workerId) { //监控周期 $serv->addtimer(1000); }); error_log(PHP_EOL . __LINE__ . PHP_EOL, 3, '/tmp/SuperMaster.log'); //定时器中操作 主要为轮巡 启动服务 $serv->on('Timer', function ($serv, $interval) { StartLogTimer(__LINE__ . 'timer start ' . time()); if (empty($serv->runServer)) { StartLogTimer(__LINE__ . ' ' . 'no server is running ' . PHP_EOL); return; } foreach ($serv->runServer as $serverName) { $ret = system("ps aux | grep " . $serverName['name'] . " | grep master | grep -v grep "); StartLogTimer(__LINE__ . ' cmd is ' . "ps aux | grep " . $serverName['name'] . " | grep master | grep -v grep " . print_r($ret, true)); if (empty($ret)) { //挂了 什么都没有 之后可能要通过数量来获取 //todo StartServ($serverName['php'], 'start', $serverName['name']); StartLogTimer(__LINE__ . date('Y-m-d H:i:s') . ' ' . print_r($serverName, true) . ' server is dead , start to restart'); } else { StartLogTimer(__LINE__ . date('Y-m-d H:i:s') . ' ' . print_r($serverName, true) . ' server is running success'); } } StartLogTimer(__LINE__ . date('Y-m-d H:i:s') . ' ' . print_r($serv->runServer, true) . ' server is dead , start to restart'); }); error_log(PHP_EOL . __LINE__ . PHP_EOL, 3, '/tmp/SuperMaster.log'); $serv->on('connect', function ($serv, $fd, $from_id) { echo "[#" . posix_getpid() . "]\tClient@[{$fd}:{$from_id}]: Connect.\n"; }); error_log(PHP_EOL . __LINE__ . PHP_EOL, 3, '/tmp/SuperMaster.log'); $serv->on('receive', function ($serv, $fd, $from_id, $data) { StartLog(__LINE__ . 'receive data is' . print_r($data, true)); $opData = json_decode($data, true); if ($opData['cmd'] == 'start') { //添加到runserver 还是需要获取路径 存入数组中 if (isset($serv->runServer[$opData['server']])) { //如果已经有了,说明服务已经启动 $serv->send($fd, json_encode(array('r' => 1, "msg" => $opData['server'] . ' is already running'))); StartLog(__LINE__ . 'receive data is' . json_encode(array('r' => 1, "msg" => $opData['server'] . ' is already running'))); return; } //如果没有,则读取配置 todo 回调中是否可以执行 getServerIni? 验证了可以 $retConf = getServerIni($opData['server']); if ($retConf['r'] != 0) { // $serv->send($fd, json_encode($retConf)); return; } else { //正常启动 $phpStart = $retConf['conf']['server']['php']; StartServ($phpStart, 'start', $opData['server']); StartLog(__LINE__ . " {$phpStart} " . STARTBASEPATH . "/lib/Swoole/shell/start.php " . $opData['cmd'] . ' ' . $opData['server']); $serv->runServer[$opData['server']] = array('php' => $phpStart, 'name' => $opData['server']); //添加到runServer中 $serv->send($fd, json_encode(array('r' => 0, 'msg' => 'server start success'))); return; } } elseif ($opData['cmd'] == 'stop') { //从runserver中干掉 $phpStart = $serv->runServer[$opData['server']]['php']; //获取php启动路径 unset($serv->runServer[$opData['server']]); StartLog(__LINE__ . 'THIS RUNSERVER IS' . print_r($serv->runServer, true)); StartServ($phpStart, 'stop', $opData['server']); StartLog(__LINE__ . "{$phpStart} " . STARTBASEPATH . "/lib/Swoole/shell/start.php " . $opData['cmd'] . ' ' . $opData['server']); $serv->send($fd, json_encode(array('r' => 0, 'msg' => 'server stop success'))); return; } elseif ($opData['cmd'] == 'status') { //获取所有服务的状态 StartLog(__LINE__ . json_encode(array('r' => 0, 'msg' => 'server running success ' . print_r($serv->runServer, true)))); $serv->send($fd, json_encode(array('r' => 0, 'data' => $serv->runServer))); return; } elseif ($opData['cmd'] == 'shutdown') { //获取所有服务的状态 StartLog(__LINE__ . json_encode(array('r' => 0, 'msg' => 'server running success ' . print_r($serv->runServer, true)))); $serv->send($fd, json_encode(array('r' => 0, 'data' => $serv->runServer))); //清除所有的runServer序列 unset($serv->runServer); return; } elseif ($opData['cmd'] == 'reload') { //重载所有服务 $phpStart = $serv->runServer[$opData['server']]['php']; //获取php启动路径 StartLog(__LINE__ . "{$phpStart} " . STARTBASEPATH . "/lib/Swoole/shell/start.php " . $opData['cmd'] . ' ' . $opData['server']); StartServ($phpStart, 'reload', $opData['server']); $serv->send($fd, json_encode(array('r' => 0, 'msg' => 'server start success'))); return; } elseif ($opData['cmd'] == 'restart') { //重启所有服务 $phpStart = $serv->runServer[$opData['server']]['php']; //获取php启动路径 //首先unset 防止被自动拉起,然后停止,然后sleep 然后start unset($serv->runServer[$opData['server']]); //从runserver中干掉 StartServ($phpStart, 'stop', $opData['server']); StartLog(__LINE__ . "{$phpStart} " . STARTBASEPATH . "/lib/Swoole/shell/start.php " . ' stop ' . $opData['server']); sleep(2); // exec("$phpStart ".STARTBASEPATH . "/lib/Swoole/shell/start.php ".' start '.$opData['server']);// StartServ($phpStart, 'start', $opData['server']); StartLog(__LINE__ . "{$phpStart} " . STARTBASEPATH . "/lib/Swoole/shell/start.php " . ' start ' . $opData['server']); $serv->runServer[$opData['server']] = array('php' => $phpStart, 'name' => $opData['server']); //添加到runServer中 $serv->send($fd, json_encode(array('r' => 0, 'msg' => 'server restart success'))); return; } }); $serv->on('close', function ($serv, $fd, $from_id) { echo "[#" . posix_getpid() . "]\tClient@[{$fd}:{$from_id}]: Close.\n"; }); $serv->start(); //之后不会再执行任何代码 }