public function callbackProcessResult($serv, $task_id, $data) { $fd = $data["fd"]; if (!isset($this->_taskinfo[$fd]) || !$data["result"]) { unset($this->_taskinfo[$fd]); return true; } $key = $this->_taskinfo[$fd]["task"][$task_id]; $this->_taskinfo[$fd]["result"][$key] = $data["result"]; unset($this->_taskinfo[$fd]["task"][$task_id]); switch ($data["type"]) { case \DoraDRPC\Base\DoraConst::SW_SYNC_SINGLE: $Packet = \DoraDRPC\Base\Packet::packFormat("OK", 0, $data["result"]); $Packet["guid"] = $this->_taskinfo[$fd]["guid"]; $Packet = \DoraDRPC\Base\Packet::packEncode($Packet); $serv->send($fd, $Packet); unset($this->_taskinfo[$fd]); return true; break; case \DoraDRPC\Base\DoraConst::SW_SYNC_MULTI: if (count($this->_taskinfo[$fd]["task"]) == 0) { $Packet = \DoraDRPC\Base\Packet::packFormat("OK", 0, $this->_taskinfo[$fd]["result"]); $Packet["guid"] = $this->_taskinfo[$fd]["guid"]; $Packet = \DoraDRPC\Base\Packet::packEncode($Packet); $serv->send($fd, $Packet); unset($this->_taskinfo[$fd]); return true; } else { return true; } break; default: unset($this->_taskinfo[$fd]); return true; break; } }
/** * 并发请求api,使用方法如 * $params = array( * "api_1117"=>array("name"=>"apiname1",“param”=>array("id"=>1117)), * "api_2"=>array("name"=>"apiname2","param"=>array("id"=>2)), * ) * @param array $params 提交参数 请指定key好方便区分对应结果,注意考虑到硬件资源有限并发请求不要超过50个 * @param bool $sync 阻塞等待所有结果 * @param int $retry 通讯错误时重试次数 * @param string $ip 要连得ip地址,如果不指定从现有配置随机个 * @param string $port 要连得port地址,如果不指定从现有配置找一个 * @return mixed 返回指定key结果 */ public function multiAPI($params, $sync = true, $retry = 0, $ip = "", $port = "") { $guid = md5(uniqid() . microtime(true) . rand(1, 1000000)); $Packet = array('guid' => $guid, 'api' => $params); if ($sync) { $Packet["type"] = \DoraDRPC\Base\DoraConst::SW_SYNC_MULTI; } else { $Packet["type"] = \DoraDRPC\Base\DoraConst::SW_ASYNC_MULTI; } $sendData = \DoraDRPC\Base\Packet::packEncode($Packet); $result = $this->doRequest($sendData, $ip, $port); //retry when the send fail while ((!isset($result["code"]) || $result["code"] != 0) && $retry > 0) { $result = $this->doRequest($sendData, $ip, $port); $retry--; } if ($result["code"] == "0" && $guid != $result["data"]["guid"]) { return \DoraDRPC\Base\Packet::packFormat("guid wrong please retry..", 100008, $result); } return $result; }
public function onReceive(\swoole_server $server, $fd, $from_id, $data) { //packet decode $requestObj = \DoraDRPC\Base\Packet::packDecode($data); #decode error if ($requestObj["code"] != 0) { $requestString = \DoraDRPC\Base\Packet::packEncode($requestObj); $server->send($fd, $requestString); return true; } //call back to process return $this->callbackRecive($server, $fd, $from_id, $requestObj["data"]); }