Requests_Transport_cURL::request_multiple() WordPress Method
The Requests_Transport_cURL::request_multiple() method is a powerful tool for making multiple HTTP requests in parallel. This can be useful for fetching data from multiple sources, or for making multiple requests to the same server with different parameters. The method takes an array of request objects as its first parameter, and an array of options as its second parameter. The options array can be used to set the maximum number of simultaneous requests (max_requests), and the number of seconds to wait for all responses (timeout). Once the requests have been made, the responses will be returned in an array, in the same order as the requests were made. If any of the requests fail, an error will be thrown.
Requests_Transport_cURL::request_multiple( array $requests, array $options ) #
Send multiple requests simultaneously
Parameters
- $requests
(array)(Required)Request data
- $options
(array)(Required)Global options
Return
(array) Array of Requests_Response objects (may contain Requests_Exception or string responses as well)
Source
File: wp-includes/Requests/Transport/cURL.php
public function request_multiple($requests, $options) { // If you're not requesting, we can't get any responses ¯\_(ツ)_/¯ if (empty($requests)) { return array(); } $multihandle = curl_multi_init(); $subrequests = array(); $subhandles = array(); $class = get_class($this); foreach ($requests as $id => $request) { $subrequests[$id] = new $class(); $subhandles[$id] = $subrequests[$id]->get_subrequest_handle($request['url'], $request['headers'], $request['data'], $request['options']); $request['options']['hooks']->dispatch('curl.before_multi_add', array(&$subhandles[$id])); curl_multi_add_handle($multihandle, $subhandles[$id]); } $completed = 0; $responses = array(); $subrequestcount = count($subrequests); $request['options']['hooks']->dispatch('curl.before_multi_exec', array(&$multihandle)); do { $active = 0; do { $status = curl_multi_exec($multihandle, $active); } while ($status === CURLM_CALL_MULTI_PERFORM); $to_process = array(); // Read the information as needed while ($done = curl_multi_info_read($multihandle)) { $key = array_search($done['handle'], $subhandles, true); if (!isset($to_process[$key])) { $to_process[$key] = $done; } } // Parse the finished requests before we start getting the new ones foreach ($to_process as $key => $done) { $options = $requests[$key]['options']; if ($done['result'] !== CURLE_OK) { //get error string for handle. $reason = curl_error($done['handle']); $exception = new Requests_Exception_Transport_cURL( $reason, Requests_Exception_Transport_cURL::EASY, $done['handle'], $done['result'] ); $responses[$key] = $exception; $options['hooks']->dispatch('transport.internal.parse_error', array(&$responses[$key], $requests[$key])); } else { $responses[$key] = $subrequests[$key]->process_response($subrequests[$key]->response_data, $options); $options['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$key], $requests[$key])); } curl_multi_remove_handle($multihandle, $done['handle']); curl_close($done['handle']); if (!is_string($responses[$key])) { $options['hooks']->dispatch('multiple.request.complete', array(&$responses[$key], $key)); } $completed++; } } while ($active || $completed < $subrequestcount); $request['options']['hooks']->dispatch('curl.after_multi_exec', array(&$multihandle)); curl_multi_close($multihandle); return $responses; }
Expand full source codeCollapse full source codeView on TracView on GitHub