Class yii\httpclient\CurlTransport
| Inheritance | yii\ |
|---|---|
| Available since extension's version | 2.0 |
| Source Code | https://github.com/yiisoft/yii2-httpclient/blob/master/src/CurlTransport.php |
CurlTransport sends HTTP messages using Client URL Library (cURL)
Note: this transport requires PHP 'curl' extension installed.
For this transport, you may setup request options as cURL Options
Public Methods
| Method | Description | Defined By |
|---|---|---|
| batchSend() | Performs multiple HTTP requests. | yii\ |
| send() | Performs given request. | yii\ |
Method Details
Performs multiple HTTP requests.
Particular transport may benefit from this method, allowing sending requests in parallel.
This method accepts an array of the yii\
| public yii\ | ||
| $requests | array |
Requests to perform. |
| return | yii\ |
Responses list. |
|---|---|---|
| throws | yii\ |
|
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);
}
if (PHP_VERSION_ID < 80500) {
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;
}
Performs given request.
| public yii\ | ||
| $request | mixed |
Request to be sent. |
| return | yii\ |
Response instance. |
|---|---|---|
| throws | yii\ |
on failure. |
public function send($request)
{
$request->beforeSend();
$curlOptions = $this->prepare($request);
$curlResource = $this->initCurl($curlOptions);
$responseHeaders = [];
$this->setHeaderOutput($curlResource, $responseHeaders);
$token = $request->client->createRequestLogToken($request->getMethod(), $curlOptions[CURLOPT_URL], $curlOptions[CURLOPT_HTTPHEADER], print_r($request->getContent(), true));
Yii::info($token, __METHOD__);
Yii::beginProfile($token, __METHOD__);
$responseContent = curl_exec($curlResource);
Yii::endProfile($token, __METHOD__);
// check cURL error
$errorNumber = curl_errno($curlResource);
$errorMessage = curl_error($curlResource);
if (PHP_VERSION_ID < 80500) {
curl_close($curlResource);
}
if ($errorNumber > 0) {
throw new Exception('Curl error: #' . $errorNumber . ' - ' . $errorMessage, $errorNumber);
}
$response = $request->client->createResponse($responseContent, $responseHeaders);
$request->afterSend($response);
return $response;
}