CloudCastle Curl

Pool
in package

FinalYes

Параллельное выполнение независимых запросов на базе `curl_multi`.

Выполняет запросы одновременно, но не более concurrency за раз, освобождая слот сразу по завершении очередного обмена. Перед добавлением каждый запрос проходит защиту от SSRF. Возвращает карту «ключ → PoolResult», где результат каждого запроса независим: сбой одного не прерывает остальные.

Пул выполняет по одному обмену на запрос (без авто-перенаправлений и повторов) — это низкоуровневый примитив пропускной способности; для полного конвейера применяйте Client::send().

Функции curl_* и curl_multi_* вызываются без указания пространства имён — в тестах их можно подменить, не выходя в сеть.

Table of Contents

Methods

__construct()  : mixed
acceptServerPush()  : $this
Принимать ресурсы HTTP/2 server push.
add()  : $this
Добавить запрос с явным ключом.
addRequest()  : $this
Добавить запрос с автоматическим числовым ключом.
concurrency()  : int
Максимум одновременных запросов.
isIdle()  : bool
Нет ли ни очереди, ни незавершённого неблокирующего прогона.
send()  : array<string|int, PoolResult>
Выполнить все запросы и вернуть результаты.
stream()  : Generator<string|int, PoolResult>
Выполнять запросы и выдавать результаты по мере готовности.
tick()  : array<string|int, PoolResult>
Выполнить один неблокирующий шаг обмена и вернуть готовые результаты.

Methods

__construct()

public __construct([int $concurrency = 10 ][, CurlConfigurator $configurator = new CurlConfigurator() ][, SsrfGuard $guard = new SsrfGuard() ][, Redactor|null $redactor = null ]) : mixed
Parameters
$concurrency : int = 10

максимум одновременных запросов

$configurator : CurlConfigurator = new CurlConfigurator()

сборщик опций cURL

$guard : SsrfGuard = new SsrfGuard()

защита от SSRF

$redactor : Redactor|null = null

редактор секретов для сообщений об ошибках (null — стандартный)

acceptServerPush()

Принимать ресурсы HTTP/2 server push.

public acceptServerPush([callable(string, array<string, string>): bool|null $filter = null ]) : $this

Сервер может заранее протолкнуть ресурсы, связанные с запросом (стили к странице, связанные сущности к ответу API), сэкономив круговые задержки. Принятый ресурс выдаётся отдельным результатом с ключом push:<URL>. Push с другого источника (схема, хост, порт), чем у исходного запроса, отклоняется всегда; остальные — по решению фильтра.

Parameters
$filter : callable(string, array<string, string>): bool|null = null

решение по URL и заголовкам push-запроса (null — принимать все)

Return values
$this —

этот же пул

add()

Добавить запрос с явным ключом.

public add(int|string $key, Request $request) : $this
Parameters
$key : int|string

ключ результата

$request : Request

запрос

Return values
$this —

этот же пул

addRequest()

Добавить запрос с автоматическим числовым ключом.

public addRequest(Request $request) : $this
Parameters
$request : Request

запрос

Return values
$this —

этот же пул

concurrency()

Максимум одновременных запросов.

public concurrency() : int
Return values
int —

предел конкурентности

isIdle()

Нет ли ни очереди, ни незавершённого неблокирующего прогона.

public isIdle() : bool
Return values
bool —

true, если пул простаивает

send()

Выполнить все запросы и вернуть результаты.

public send() : array<string|int, PoolResult>

Очередь запросов потребляется: после вызова пул пуст и готов к новому набору запросов, а прежние результаты не переносятся в следующий прогон.

Return values
array<string|int, PoolResult> —

карта «ключ → результат»

stream()

Выполнять запросы и выдавать результаты по мере готовности.

public stream() : Generator<string|int, PoolResult>

Генератор отдаёт пары «ключ → PoolResult» в порядке завершения обменов, не накапливая все ответы в памяти: обработанный результат можно сразу отпустить. Досрочный выход из цикла (break) корректно освобождает незавершённые дескрипторы. Очередь запросов потребляется.

Return values
Generator<string|int, PoolResult> —

результаты по мере завершения

tick()

Выполнить один неблокирующий шаг обмена и вернуть готовые результаты.

public tick() : array<string|int, PoolResult>

Для встраивания в event loop (ReactPHP, Amp/Revolt, таймеры Swoole): вызывайте периодически, пока Pool::isIdle() не вернёт true. Шаг не ждёт сеть — передаёт данные, которые уже готовы, и сразу возвращает управление циклу. Запросы, добавленные во время прогона, выполняются следующим прогоном.

Tags
SuppressWarnings

("PHPMD.UnusedLocalVariable")

Return values
array<string|int, PoolResult> —

результаты, завершившиеся на этом шаге

On this page

Search results