function onReceive_unpack_php($serv, $fd, $from_id, $data)
 {
     if (empty($this->buffer[$fd])) {
         $this->buffer[$fd] = '';
         $this->length[$fd] = 0;
     }
     $this->buffer[$fd] .= $data;
     $buffer =& $this->buffer[$fd];
     do {
         if ($this->length[$fd] === 0) {
             $n = unpack('Nlen', substr($buffer, 0, 4));
             $this->length[$fd] = $n['len'];
             if ($n['len'] > self::MAX_PACKAGE_LEN) {
                 $this->serv->close($fd);
                 return;
             }
         }
         if (strlen($buffer) >= $this->length[$fd]) {
             $this->onPackage($fd, substr($buffer, 0, $this->length[$fd]));
             $buffer = substr($buffer, $this->length[$fd]);
             $this->length[$fd] = 0;
         } else {
             break;
         }
     } while (strlen($buffer) > 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;
 }
Beispiel #3
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;
 }
Beispiel #4
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";
     }
 }
Beispiel #5
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;
 }
Beispiel #6
0
 /**
  * @param \swoole_server $serv
  * @param $fd
  * @param $from_id
  * @param $data
  */
 function onReceive($serv, $fd, $from_id, $data)
 {
     $parser = new \HttpParser();
     if (empty($this->buffers[$fd])) {
         $this->clearBuffer($fd);
     }
     $this->buffers[$fd] .= $data;
     $buffer =& $this->buffers[$fd];
     $nparsed =& $this->nparsed[$fd];
     $nparsed = $parser->execute($buffer, $nparsed);
     if ($parser->hasError()) {
         $serv->close($fd, $from_id);
     } else {
         if ($parser->isFinished()) {
             $this->clearBuffer($fd);
             $_SERVER = $parser->getEnvironment();
             $_GET = array();
             if (!empty($_SERVER['QUERY_STRING'])) {
                 parse_str($_SERVER['QUERY_STRING'], $_GET);
             }
             if (!empty($_SERVER['REQUEST_BODY'])) {
                 parse_str($_SERVER['REQUEST_BODY'], $_POST);
             }
             if (!empty($_SERVER['HTTP_COOKIE'])) {
                 $_COOKIE = self::parseCookie($_SERVER['HTTP_COOKIE']);
             }
             $this->currentFd = $fd;
             call_user_func($this->_onRequest, $this);
         }
     }
 }
 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");
     }
 }
Beispiel #8
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();
 }
Beispiel #9
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;
 }
Beispiel #10
0
<?php

$serv = new swoole_server("0.0.0.0", 9509);
$serv->set(array('worker_num' => 1));
$serv->on('workerStart', function ($serv, $worker_id) {
    //if($worker_id == 0) $serv->addtimer(500);
});
$serv->on('connect', function ($serv, $fd, $from_id) {
    $serv->array['fd'] =& strval($fd);
    echo "[#" . posix_getpid() . "]\tClient@[{$fd}:{$from_id}]: Connect.\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
    //echo "[#".posix_getpid()."]\tClient[$fd]: $data\n";
    $array = array('A', 'B', 'C', 'D', 'E', 'F', 'G');
    $data = '';
    $n_bytes = 0;
    for ($i = 0; $i < 10; $i++) {
        $_str = str_repeat($array[$i % 7], 4030) . "\n";
        //$serv->send($fd, $_str);
        $n_bytes += strlen($_str);
        $data .= $_str;
    }
    echo "send " . $n_bytes . " bytes\n";
    $serv->send($serv->array['fd'], $data);
    $serv->close($fd);
});
$serv->on('close', function ($serv, $fd, $from_id) {
    echo "[#" . posix_getpid() . "]\tClient@[{$fd}:{$from_id}]: Close.\n";
});
$serv->start();
 public function onError(swoole_client $cli)
 {
     Trace::debug("*********cli {$this->fd} error");
     $this->serv->close($this->fd);
     $cli->close();
 }
Beispiel #12
0
 /**
  * 接收到数据时回调此函数,发生在worker进程中
  *
  * @param $serv
  * @param $fd
  * @param $from_id
  * @param $data
  * @author yangyifan <*****@*****.**>
  */
 public function onReceive(swoole_server $serv, $fd, $from_id, $data)
 {
     $data = json_decode($data, true);
     if ($data['step'] == 'task') {
         //开始 task
         $params = ['fd' => $fd, 'targer' => $data['targer'], 'params' => $data['params'], 'callback' => $data['callback']];
         $serv->task($params);
     } else {
         if ($data['step'] == 'default') {
             $send_data = '来至' . $from_id . ':' . $data['params']['data'] . $this->swoole_config['package_eof'];
             echo $send_data;
             //$this->swoole_server->send($fd, $send_data);
         }
     }
     $serv->close($fd);
 }
 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);
 }
Beispiel #14
0
<?php

/**
 * Created by PhpStorm.
 * User: zhaoquan
 * Date: 15-5-29
 * Time: 下午2:59
 */
$server = new swoole_server("127.0.0.1", 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();
Beispiel #15
0
 /**
  * @param $client_id
  * @return bool
  */
 public function close($client_id)
 {
     return $this->server->close($client_id);
 }
Beispiel #16
0
 /**
  * 接收到数据时回调此函数,发生在worker进程中
  *
  * @param $serv
  * @param $fd
  * @param $from_id
  * @param $data
  * @author yangyifan <*****@*****.**>
  */
 public function onReceive(swoole_server $serv, $fd, $from_id, $data)
 {
     //解析数据
     $data = json_decode($data, true);
     switch ($data['step']) {
         //异步任务
         case 'task':
             //开始 task
             $params = ['fd' => $fd, 'targer' => $data['targer'], 'params' => $data['params'], 'callback' => $data['callback']];
             //发送异步请求
             $serv->task($params);
             break;
             //保存用户信息
         //保存用户信息
         case 'save_user':
             $user_info = unserialize($data['params']);
             $user_info->fd = $fd;
             $params = ['fd' => $fd, 'targer' => $data['targer'], 'params' => ['user_info' => serialize($user_info)], 'callback' => $data['callback']];
             //发送异步请求
             $serv->task($params);
             break;
             //发送消息到用户
         //发送消息到用户
         case 'send_message_to_user':
             $serv->send($data['params']['fd'], $data['params']['data']);
             break;
             //默认操作
         //默认操作
         case 'default':
             break;
     }
     //关闭连接
     $serv->close($fd);
 }
Beispiel #17
0
 /**
  * 启动计划任务,支持异步处理
  */
 public function runTask()
 {
     $oldErrorHandler = set_error_handler(array(__CLASS__, 'myErrorHandler'));
     $config = DI()->config->get('app.Swoole.task');
     $ip = isset($config['ip']) ? $config['ip'] : '127.0.0.1';
     $port = isset($config['port']) ? $config['port'] : 9502;
     $workerNum = isset($config['worker_num']) ? $config['worker_num'] : 4;
     $serv = new swoole_server($ip, $port);
     $serv->set(array('task_worker_num' => $workerNum));
     $serv->on('Receive', function ($serv, $fd, $fromId, $data) {
         $taskId = $serv->task($data);
         DI()->logger->debug("asynctask({$taskId}) dispath in swoole", $data);
     });
     $serv->on('Task', function ($serv, $taskId, $fromId, $data) {
         DI()->logger->debug("asynctask({$taskId}) start in swoole", $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->finish($rs->formatResult($apiRs));
         } catch (Exception $ex) {
             echo $ex->getTraceAsString();
             DI()->logger->error("asynctask({$taskId}) exception in swoole", $ex->getMessage());
             $serv->finish("Exception: " . $ex->getMessage());
             //TODO 通知管理员
         }
         if (DI()->notorm) {
             DI()->notorm->disconnect();
         }
     });
     $serv->on('Finish', function ($serv, $taskId, $data) {
         DI()->logger->debug("asynctask({$taskId}) finish in swoole", $data);
         $serv->close($taskId);
     });
     $serv->start();
 }
Beispiel #18
0
function my_onReceive(swoole_server $serv, $fd, $from_id, $data)
{
    my_log("Worker#{$serv->worker_pid} Client[{$fd}@{$from_id}]: received: {$data}");
    $cmd = trim($data);
    if ($cmd == "reload") {
        $serv->reload();
    } elseif ($cmd == "task") {
        $task_id = $serv->task("task-" . $fd);
        echo "Dispath AsyncTask: id={$task_id}\n";
    } elseif ($cmd == "taskwait") {
        $result = $serv->taskwait("taskwait");
        if ($result) {
            $serv->send($fd, "taskwaitok");
        }
        echo "SyncTask: result=" . var_export($result, true) . "\n";
    } elseif ($cmd == "hellotask") {
        $serv->task("hellotask");
    } elseif ($cmd == "sendto") {
        $serv->sendto("127.0.0.1", 9999, "hello world");
    } elseif ($cmd == "close") {
        $serv->send($fd, "close connection\n");
        $result = $serv->close($fd);
    } elseif ($cmd == "info") {
        $info = $serv->connection_info(strval($fd), $from_id);
        var_dump($info["remote_ip"]);
        $serv->send($fd, 'Info: ' . var_export($info, true) . PHP_EOL);
    } elseif ($cmd == 'proxy') {
        $serv->send(1, "hello world\n");
    } elseif ($cmd == 'sleep') {
        sleep(10);
    } elseif ($cmd == 'foreach') {
        foreach ($serv->connections as $fd) {
            echo "conn : {$fd}\n";
        }
        return;
    } elseif ($cmd == 'tick') {
        $serv->tick(2000, function ($id) {
            echo "tick #{$id}\n";
        });
    } elseif ($cmd == 'addtimer') {
        $serv->addtimer(3000);
    } elseif ($cmd == "list") {
        $start_fd = 0;
        echo "broadcast\n";
        while (true) {
            $conn_list = $serv->connection_list($start_fd, 10);
            if (empty($conn_list)) {
                echo "iterates finished\n";
                break;
            }
            $start_fd = end($conn_list);
            var_dump($conn_list);
        }
    } elseif ($cmd == "list2") {
        foreach ($serv->connections as $con) {
            var_dump($serv->connection_info($con));
        }
    } elseif ($cmd == "stats") {
        $serv_stats = $serv->stats();
        $serv->send($fd, 'Stats: ' . var_export($serv_stats, true) . PHP_EOL);
    } elseif ($cmd == "broadcast") {
        broadcast($serv, $fd, "hello from {$fd}\n");
    } elseif ($cmd == "error") {
        hello_no_exists();
    } elseif ($cmd == "exit") {
        exit("worker php exit.\n");
    } elseif (substr($cmd, 0, 5) == "close") {
        $close_fd = substr($cmd, 6);
        $serv->close($close_fd);
    } elseif ($cmd == "shutdown") {
        $serv->shutdown();
    } elseif ($cmd == 'sendbuffer') {
        $buffer = G::getBuffer($fd);
        $buffer->append("hello\n");
        $serv->send($fd, $buffer);
    } else {
        $ret = $serv->send($fd, 'Swoole: ' . $data, $from_id);
        var_dump($ret);
        //$serv->close($fd);
    }
    //echo "Client:Data. fd=$fd|from_id=$from_id|data=$data";
    //    $serv->after(
    //        800, function () {
    //            echo "hello";
    //        }
    //    );
    //swoole_server_send($serv, $other_fd, "Server: $data", $other_from_id);
}
Beispiel #19
0
function my_onReceive(swoole_server $serv, $fd, $from_id, $data)
{
    my_log("Worker#{$serv->worker_pid} Client[{$fd}@{$from_id}]: received: {$data}");
    $cmd = trim($data);
    if ($cmd == "reload") {
        $serv->reload();
    } elseif ($cmd == "task") {
        $serv->task("task-" . $fd);
    } elseif ($cmd == "taskwait") {
        $result = $serv->taskwait("taskwait");
        if ($result) {
            $serv->send($fd, "taskwaitok");
        }
    } elseif ($cmd == "taskWaitMulti") {
        $tasks = array('taskWaitMulti', 'taskWaitMulti');
        $result = $serv->taskWaitMulti($tasks);
        if (is_array($result)) {
            $serv->send($fd, "taskWaitMulti OK");
        } else {
            $serv->send($fd, "taskWaitMulti error");
        }
    } elseif ($cmd == "hellotask") {
        $serv->task("hellotask");
    } elseif ($cmd == "sendto") {
        $serv->sendto("127.0.0.1", 9999, "hello world");
    } elseif ($cmd == "close") {
        $serv->close($fd);
    } elseif ($cmd == "info") {
        $info = $serv->connection_info(strval($fd), $from_id);
        $serv->send($fd, serialize($info));
    } elseif ($cmd == 'proxy') {
        $serv->send(1, "hello world\n");
    } elseif ($cmd == 'sleep') {
        sleep(10);
    } elseif ($cmd == 'sendfile') {
        $serv->sendfile($fd, __DIR__ . '/test.jpg');
    } elseif ($cmd == 'foreach') {
        foreach ($serv->connections as $fd) {
            echo "conn : {$fd}\n";
        }
        return;
    } elseif ($cmd == 'tick') {
        $serv->tick(1000, function ($id) use($serv, $fd) {
            $serv->send($fd, "tick");
            $serv->clearTimer($id);
        });
    } elseif ($cmd == 'after') {
        $serv->after(1000, function ($id) use($serv, $fd) {
            $serv->send($fd, "after");
        });
    } elseif ($cmd == "list") {
        $start_fd = 0;
        echo "broadcast\n";
        while (true) {
            $conn_list = $serv->connection_list($start_fd, 10);
            if (empty($conn_list)) {
                echo "iterates finished\n";
                break;
            }
            $start_fd = end($conn_list);
            var_dump($conn_list);
        }
    } elseif ($cmd == "list2") {
        foreach ($serv->connections as $con) {
            var_dump($serv->connection_info($con));
        }
    } elseif ($cmd == "stats") {
        $serv_stats = $serv->stats();
        $serv->send($fd, 'Stats: ' . var_export($serv_stats, true) . "\ncount=" . count($serv->connections) . PHP_EOL);
    } elseif ($cmd == "broadcast") {
        broadcast($serv, $fd, "hello from {$fd}\n");
    } elseif ($cmd == "error") {
        hello_no_exists();
    } elseif ($cmd == "exit") {
        exit("worker php exit.\n");
    } elseif (substr($cmd, 0, 5) == "close") {
        $close_fd = substr($cmd, 6);
        $serv->close($close_fd);
    } elseif ($cmd == "shutdown") {
        $serv->shutdown();
    } elseif ($cmd == "fatalerror") {
        require __DIR__ . '/php/error.php';
    } elseif ($cmd == 'sendbuffer') {
        $buffer = G::getBuffer($fd);
        $buffer->append("hello\n");
        $serv->send($fd, $buffer);
    } elseif ($cmd == 'defer') {
        $serv->defer(function () use($fd, $serv) {
            $serv->close($fd);
            $serv->defer(function () {
                echo "deferd\n";
            });
        });
        $serv->send($fd, 'Swoole: ' . $data, $from_id);
    } elseif ($cmd == 'big_resp') {
        $serv->send($fd, str_repeat('A', 256 * 1024));
    } elseif ($cmd == 'big_task') {
        $serv->task($fd . ' ' . str_repeat('A', 256 * 1024 - 8));
    } else {
        $serv->send($fd, 'Swoole: ' . $data, $from_id);
        //$serv->close($fd);
    }
    //echo "Client:Data. fd=$fd|from_id=$from_id|data=$data";
    //    $serv->after(
    //        800, function () {
    //            echo "hello";
    //        }
    //    );
    //swoole_server_send($serv, $other_fd, "Server: $data", $other_from_id);
}
Beispiel #20
0
 function close($client_id)
 {
     return $this->sw->close($client_id);
 }
Beispiel #21
0
function my_onTask(swoole_server $serv, $task_id, $from_id, $data)
{
    if ($data == 'taskwait') {
        $fd = str_replace('task-', '', $data);
        $serv->send($fd, "hello world");
        return array("task" => 'wait');
    } elseif ($data == 'taskcallback') {
        return array("task" => 'callback');
    } else {
        $cmd = explode(' ', $data);
        if ($cmd[0] == 'send') {
            $serv->send($cmd[1], str_repeat('A', 10000) . "\n");
        } elseif ($cmd[0] == 'close') {
            $serv->close($cmd[1]);
        }
        //        $serv->sendto('127.0.0.1', 9999, "hello world");
        //swoole_timer_after(1000, "test");
        //        var_dump($data);
        //        $serv->send($fd, str_repeat('A', 8192 * 2));
        //        $serv->send($fd, str_repeat('B', 8192 * 2));
        //        $serv->send($fd, str_repeat('C', 8192 * 2));
        //        $serv->send($fd, str_repeat('D', 8192 * 2));
        return;
    }
    if ($data == "hellotask") {
        broadcast($serv, 0, "hellotask");
    } else {
        echo "AsyncTask[PID=" . $serv->worker_pid . "]: task_id={$task_id}." . PHP_EOL;
        //eg: test-18
        return $data;
    }
}
Beispiel #22
0
 public function my_onReceive(\swoole_server $serv, $fd, $from_id, $rdata)
 {
     $data = json_decode($rdata, true);
     if (isset($data['class'])) {
         $type = $data['class'];
         if (!isset(self::$cnt[$type])) {
             // 没有专属处理进程,则使用公共进程
             $type = 'Common';
         }
         $tid = $this->getTaskId($type);
         $data['fd'] = $fd;
         $rs = $serv->task($data, $tid);
         //调用task事件
         echo "receive to task ,task_id ={$tid} \n";
         return;
     } else {
         echo "没有相应 事件处理类, 报警\n";
         $serv->close($fd);
         //服务端主动断开连接
     }
     return;
 }
Beispiel #23
0
 /**
  * 关闭连接
  * 如果传了fd ,则关闭指定连接
  * @return [type] [description]
  */
 public function close(\swoole_server $serv, $fd = '', $from_id = '', $data = '')
 {
     $serv->close($fd);
 }