/** * 接收到数据 * @param $client_id * @param $data * @return unknown_type */ function onReceive($serv, $client_id, $from_id, $data) { //检测request data完整性 //请求不完整,继续等待 if ($this->checkData($client_id, $data) === false) { return true; } //完整的请求 $data = $this->buffer[$client_id]; //解析请求 $request = $this->parse_request($data); if ($request === false) { $this->server->close($client_id); return false; } //处理请求,产生response对象 $response = $this->onRequest($request); //发送response $this->response($client_id, $response); //回收内存 unset($data); $request->unsetGlobal(); unset($request); unset($response); //清空buffer $this->buffer[$client_id] = ""; $this->server->close($client_id); }
public function onReceive($server, $fd, $fromId, $data) { /** * @var \Swoole\Server $server */ $tmp = @msgpack_unpack($data); if ($tmp && is_object($tmp)) { $data = $tmp; unset($tmp); if ($data instanceof \stdClass) { if ($data->bind) { # 绑定进程ID $server->bind($fd, $data->id); return; } if ($key = \MyQEE\Server\Register\Client::$host->key) { # 需要解密 $data = \MyQEE\Server\RPC\Server::decryption($data, $key); # 解密失败 if (!$data) { return; } } $eof = \MyQEE\Server\RPC\Server::$EOF; switch ($data->type) { case 'task': case 'taskWait': $rs = Server::$workerTask->onTask($server, $data->id, $data->wid, $data->data, $data->sid); if ($rs !== null || $data->type === 'taskWait') { # 执行 Finish $rsData = new \stdClass(); $rsData->id = $data->id; $rsData->data = $rs; $rsData->wname = $data->wname; if ($key) { # 加密数据 $rsData = \MyQEE\Server\RPC\Server::encrypt($rsData, $key) . $eof; } else { # 格式化数据 $rsData = msgpack_pack($rsData) . $eof; } $server->send($fd, $rsData, $fromId); } break; } } } else { Server::$instance->warn("task server get error msgpack data length: " . strlen($data)); Server::$instance->debug($data); $this->server->close($fd); } }
/** * 收到信息 * * @param \Swoole\Server $server * @param $fd * @param $fromId * @param $data */ public function onReceive($server, $fd, $fromId, $data) { $data = trim($data); if ($data === '') { return; } /** * @var \Swoole\Server $server */ $tmp = @msgpack_unpack($data); if (is_object($tmp) && $tmp instanceof \stdClass) { $rpc = static::$defaultRPC; if ($tmp->rpc) { if (preg_match('#^[\\\\0-9a-z]+$#i', $tmp->rpc)) { $rpc = $tmp->rpc; } } /** * @var RPC $rpc */ $key = $rpc::_getRpcKey(); if ($key) { # 解密数据 $tmp = self::decryption($tmp, $key, $rpc); if (false === $tmp) { # 数据错误 $server->send($fd, '{"type":"close","code":0,"msg":"decryption fail."}' . static::$EOF); $server->close($fd, $fromId); \MyQEE\Server\Server::$instance->debug("register server decryption error, data: " . substr($data, 0, 256) . (strlen($data) > 256 ? '...' : '')); return; } } $data = $tmp; unset($tmp); if ('bind' === $data->type) { if ($this->server->setting['dispatch_mode'] === 5 && is_int($data->id)) { # 支持 worker 绑定 $this->server->bind($fd, $data->id); } return; } $data->rpc = $rpc; if (in_array($this->server->setting['dispatch_mode'], [1, 3]) && ($workerNum = $this->server->setting['worker_num']) > 1) { # 服务器是轮循或抢占模式, 每次请求的可能不是同一个 worker $workerId = $fd % $workerNum; if ($workerId !== $this->server->worker_id) { # 发送给对应的进程去处理 $obj = new \stdClass(); $obj->type = 'call'; $obj->fd = $fd; $obj->fromId = $fromId; $obj->data = $data; $this->sendMessage($data, $workerId); return; } } # 执行RPC调用 $this->call($fd, $fromId, $data); } else { \MyQEE\Server\Server::$instance->warn("rpc get error msgpack data: " . substr($data, 0, 256) . (strlen($data) > 256 ? '...' : '')); $this->server->close($fd, $fromId); return; } }