public function batchSend(array $requests)
{
$curlBatchResource = curl_multi_init();
$token = '';
$curlResources = [];
$responseHeaders = [];
foreach ($requests as $key => $request) {
/* @var $request Request */
$request->beforeSend();
$curlOptions = $this->prepare($request);
$curlResource = $this->initCurl($curlOptions);
$token .= $request->client->createRequestLogToken($request->getMethod(), $curlOptions[CURLOPT_URL], $curlOptions[CURLOPT_HTTPHEADER], $request->getContent()) . "\n\n";
$responseHeaders[$key] = [];
$this->setHeaderOutput($curlResource, $responseHeaders[$key]);
$curlResources[$key] = $curlResource;
curl_multi_add_handle($curlBatchResource, $curlResource);
}
Yii::info($token, __METHOD__);
Yii::beginProfile($token, __METHOD__);
try {
$isRunning = null;
do {
// See https://bugs.php.net/bug.php?id=61141
if (curl_multi_select($curlBatchResource) === -1) {
usleep(100);
}
do {
$curlExecCode = curl_multi_exec($curlBatchResource, $isRunning);
} while ($curlExecCode === CURLM_CALL_MULTI_PERFORM);
} while ($isRunning > 0 && $curlExecCode === CURLM_OK);
} catch (\Exception $e) {
Yii::endProfile($token, __METHOD__);
throw new Exception($e->getMessage(), $e->getCode(), $e);
}
Yii::endProfile($token, __METHOD__);
$responseContents = [];
foreach ($curlResources as $key => $curlResource) {
$responseContents[$key] = curl_multi_getcontent($curlResource);
curl_multi_remove_handle($curlBatchResource, $curlResource);
}
curl_multi_close($curlBatchResource);
$responses = [];
foreach ($requests as $key => $request) {
$response = $request->client->createResponse($responseContents[$key], $responseHeaders[$key]);
$request->afterSend($response);
$responses[$key] = $response;
}
return $responses;
}