/** * 判断包是否都到达 * @see PHPServerWorker::dealInput() */ public function dealInput($recv_str) { return JMProtocol::checkInput($recv_str); }
/** * 批量请求 * @param array $request_buffer_array ['ip:port'=>req_buf, 'ip:port'=>req_buf, ...] * @return multitype:unknown string */ public function multiRequest($request_buffer_array) { $client_array = $sock_to_ip = $ip_list = array(); foreach ($request_buffer_array as $address => $buffer) { list($ip, $port) = explode(':', $address); $ip_list[$ip] = $ip; $client = stream_socket_client("tcp://{$address}", $errno, $errmsg, 1); if (!$client) { $this->notice("connect tcp://{$address} fail"); continue; } $client_array[$address] = $client; stream_set_timeout($client_array[$address], 0, 500000); fwrite($client_array[$address], $buffer); stream_set_blocking($client_array[$address], 0); $sock_to_address[(int) $client] = $address; } $read = $client_array; $write = $except = $read_buffer = array(); $time_start = microtime(true); $timeout = 5; // 轮询处理数据 while (count($read) > 0) { if (stream_select($read, $write, $except, 0, 200000)) { foreach ($read as $socket) { $address = $sock_to_address[(int) $socket]; $buf = fread($socket, 8192); if (!$buf) { if (feof($socket)) { unset($client_array[$address]); } continue; } if (!isset($read_buffer[$address])) { $read_buffer[$address] = $buf; } else { $read_buffer[$address] .= $buf; } // 数据接收完毕 if (0 === JMProtocol::checkInput($read_buffer[$address])) { unset($client_array[$address]); } } } // 超时了 if (microtime(true) - $time_start > $timeout) { break; } $read = $client_array; } foreach ($read_buffer as $address => $buf) { list($ip, $port) = explode(':', $address); $this->lastSuccessIpArray[$ip] = $ip; } $this->lastFailedIpArray = array_diff($ip_list, $this->lastSuccessIpArray); ksort($read_buffer); return $read_buffer; }