Пакетная отправка запросов

HTTP-клиент позволяет отправлять несколько запросов одновременно, используя метод yii\httpclient\Client::batchSend():

use yii\httpclient\Client;

$client = new Client();

$requests = [
    $client->get('http://domain.com/keep-alive'),
    $client->post('http://domain.com/notify', ['userId' => 12]),
];
$responses = $client->batchSend($requests);

Особый транспорт может дать пользу, при использовании данного подхода, позволяя повысить производительность. Среди встроенных транспортов только yii\httpclient\CurlTransport делает это. Он позволяет отправлять запросы параллельно, что экономит время выполнения программы.

Note: только некоторые конкретные транспорты позволяют особым образом обрабатывать запросы, посредством batchSend() что даёт некоторую выгоду. По умолчанию транспорт отправляет их по одному без каких-либо ошибок и предупреждений. Убедитесь, что вы настроили правильный транспорт для клиента, если хотите добиться повышения производительности.

Метод batchSend() возвращает массив ответов, ключи которых соответствуют ключам из массива запросов. Это позволяет с лёгкостью обрабатывать конкретный ответ на запрос:

use yii\httpclient\Client;

$client = new Client();

$requests = [
    'news' => $client->get('http://domain.com/news'),
    'friends' => $client->get('http://domain.com/user/friends', ['userId' => 12]),
    'newComment' => $client->post('http://domain.com/user/comments', ['userId' => 12, 'content' => 'New comment']),
];
$responses = $client->batchSend($requests);

// result of `GET http://domain.com/news` :
if ($responses['news']->isOk) {
    echo $responses['news']->content;
}

// result of `GET http://domain.com/user/friends` :
if ($responses['friends']->isOk) {
    echo $responses['friends']->content;
}

// result of `POST http://domain.com/user/comments` :
if ($responses['newComment']->isOk) {
    echo "Comment has been added successfully";
}