Пример #1
0
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;
        }
    }
}
Пример #2
0
 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();
 }
Пример #3
0
 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);
     }
 }
Пример #4
0
 function errorHandler()
 {
     if (!empty($this->current_fd)) {
         $rsp = Proxy::shutdown_handler();
         $rsp && $this->serv->send($this->current_fd, $rsp);
     }
 }
Пример #5
0
 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);
 }
Пример #6
0
 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);
     }
 }
Пример #7
0
 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;
 }
Пример #8
0
 /**
  * 发送回应
  * @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;
 }
Пример #9
0
 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";
     }
 }
Пример #10
0
 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);
     }
 }
Пример #11
0
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);
}
Пример #12
0
 /**
  * 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;
 }
Пример #13
0
 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);
     }
 }
Пример #14
0
 /**
  * 发送回应
  * @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;
 }
Пример #15
0
 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);
         }
     }
 }
Пример #16
0
 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);
 }
Пример #17
0
 /**
  * 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);
 }
Пример #18
0
 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");
 }
Пример #19
0
 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");
     }
 }
Пример #20
0
 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);
     }
 }
Пример #21
0
 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();
 }
Пример #22
0
 /**
  * 服务端接收数据
  *
  * @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));
     }
 }
Пример #23
0
 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();
 }
Пример #24
0
 /**
  * 发送网络数据
  * @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);
     			}
     		}*/
 }
Пример #25
0
 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;
 }
Пример #26
0
 /**
  * 启动接口服务,支持长链接
  */
 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();
 }
Пример #27
0
 /**
  * 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';
     }
 }
Пример #28
0
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);
        }
    }
}
Пример #29
0
 function send($client_id, $data)
 {
     return $this->sw->send($client_id, $data);
 }
Пример #30
0
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();
    //之后不会再执行任何代码
}