Beispiel #1
0
 /**
 * 接收到数据
 * @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);
 }
Beispiel #2
0
 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);
     }
 }
Beispiel #3
0
 /**
  * 收到信息
  *
  * @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;
     }
 }