1. Method#multiRequest 接收需要处理的信息
这里的参数是我们所需要的处理的URL地址及其它信息。
/** * @param array ('key' => array()) * You can find 'key' inside of @method getApiMap * array('someMethodKey'=>array('url' => '', * 'requestData' => 'post data', * 'otherData' => 'some other data', * 'curlOptions' => array()))); */ public function multiRequest($array){ foreach($array as $k=>&$v) { $v['url'] = $this->getApiURL($k); } return $this->_handleMultiResponse($this->_sendMultiRequest($array));}
2. Method#_sendMultiRequest()
/** * Send multi request at same time * @param array $data ( * array('url' => '', * 'requestData' => 'post data', * 'otherData' => 'some other data', * 'curlOptions' => array())); */ private function _sendMultiRequest(array $data) { $this->_logMultiRequest($data); $conn = array(); //create the multiple cURL handle $mh = curl_multi_init(); $_options = array( CURLOPT_HEADER => false, CURLOPT_POST => true, CURLOPT_CONNECTTIMEOUT => $this->timeOut, CURLOPT_TIMEOUT => $this->timeOut, CURLOPT_RETURNTRANSFER => true, ); foreach($data as $k=>$v) { $options = CMap::mergeArray($_options, array( CURLOPT_URL => $v['url'], CURLOPT_POSTFIELDS => $v['requestData'], )); if (isset($v['curlOptions']) && is_array($v['curlOptions']) && !empty($v['curlOptions'])) { $options = CMap::mergeArray($options, $v['curlOptions']); } $conn[$k] = curl_init(); curl_setopt_array($conn[$k], $options); //add the two handles curl_multi_add_handle($mh, $conn[$k]); } $active = null; //execute the handles do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } $result = array(); foreach($data as $k=>$v) { $result[$k] = array( 'curlInfo' => curl_getinfo($conn[$k]), 'response' => curl_multi_getcontent($conn[$k]), ); //close the handles curl_multi_remove_handle($mh, $conn[$k]); } curl_multi_close($mh); $this->_logMultiResponse($result); return $result; }
3. Method#_handleMultiResponse()
private function _handleMultiResponse($result) { foreach($result as $k=>&$v) { $handleMethod = '_handle'. ucfirst($k); $v = $this->$handleMethod($v['response']); } return $result; }
从处理返回方法可以看到,我们仍然需要单独去处理每一个请求的返回,并返回!