Метод pool
Метод pool класса Http позволяет выполнять несколько HTTP-запросов конкурентно (параллельно). Он принимает массив или коллекцию с описаниями запросов и возвращает массив объектов Response. Это особенно полезно, когда нужно отправить запросы к нескольким внешним сервисам одновременно, чтобы сократить общее время выполнения.
Синтаксис
<?php
$responses = Http::pool(function ($pool) {
return [
$pool->get('https://api.example.com/users'),
$pool->get('https://api.example.com/posts'),
$pool->get('https://api.example.com/comments'),
];
});
?>
Пример
Давайте выполним три параллельных запроса к разным эндпоинтам API:
<?php
use Illuminate\Support\Facades\Http;
$res = Http::pool(function ($pool) {
return [
$pool->get('https://jsonplaceholder.typicode.com/users/1'),
$pool->get('https://jsonplaceholder.typicode.com/posts/1'),
$pool->get('https://jsonplaceholder.typicode.com/comments/1'),
];
});
echo $res[0]->status();
echo $res[1]->status();
echo $res[2]->status();
?>
Результат выполнения кода:
"200"
"200"
"200"
Пример
Выполним параллельные запросы с различными методами и передачей данных:
<?php
use Illuminate\Support\Facades\Http;
$res = Http::pool(function ($pool) {
return [
$pool->get('https://api.example.com/users'),
$pool->post('https://api.example.com/posts', [
'title' => 'New Post',
'body' => 'Content',
]),
$pool->put('https://api.example.com/users/1', [
'name' => 'Updated User',
]),
];
});
echo $res[0]->body();
echo $res[1]->status();
echo $res[2]->status();
?>
Результат выполнения кода:
"[ { 'id': 1, 'name': 'User 1' } ]"
"201"
"200"
Пример
Использование пула с общими параметрами для всех запросов:
<?php
use Illuminate\Support\Facades\Http;
$res = Http::withHeaders([
'Authorization' => 'Bearer token123',
'Accept' => 'application/json',
])->pool(function ($pool) {
return [
$pool->get('https://api.example.com/users'),
$pool->get('https://api.example.com/posts'),
$pool->get('https://api.example.com/comments'),
];
});
echo count($res);
?>
Результат выполнения кода:
"3"
Пример
Выполним пул запросов и обработаем полученные данные:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Http;
class ApiController extends Controller
{
public function index()
{
$res = Http::pool(function ($pool) {
return [
'users' => $pool->get('https://api.example.com/users'),
'posts' => $pool->get('https://api.example.com/posts'),
'comments' => $pool->get('https://api.example.com/comments'),
];
});
$users = $res['users']->json();
$posts = $res['posts']->json();
$comments = $res['comments']->json();
return view('dashboard', [
'users' => $users,
'posts' => $posts,
'comments' => $comments,
]);
}
}
?>
Смотрите также
-
метод
get,
который выполняет GET-запрос -
метод
post,
который отправляет POST-запрос -
метод
withHeaders,
который добавляет заголовки к запросу -
метод
json,
который преобразует ответ в массив