Coloque o proxy de cada tarefa do Guzzle na operação assíncrona iniciada pelo pool. Dentro de uma configuração de cliente existente, use fábricas de promessas:

$operations = function () use ($client, $jobs) {
    foreach ($jobs as $id => $job) {
        yield $id => function () use ($client, $job) {
            return $client->requestAsync('GET', $job['url'], [
                'proxy' => $job['proxy'],
                'timeout' => 20,
            ]);
        };
    }
};

$pool = new GuzzleHttp\Pool($client, $operations(), [
    'concurrency' => 4,
]);
$pool->promise()->wait();

Cada tarefa validada fornece um destino e um proxy. Para uma solicitação pública permitida, um candidato HTTP da lista de proxies HTTP pode fornecer a URL de proxy sem credenciais dessa tarefa; a seleção acontece antes de sua fábrica ser executada. Uma solicitação PSR-7 descreve a mensagem HTTP, enquanto estas opções de envio controlam o transporte. Imprimir ou armazenar um valor de proxy ao lado da mensagem não consegue configurar uma operação que o envie de outra forma.

Retorne requestAsync() da fábrica. Chamar request() síncrono ali pode bloquear enquanto o pool tenta iniciar trabalho concorrente.

Adicione callbacks de cumprimento e rejeição usando o tratamento existente da aplicação. Mantenha a chave da tarefa, o identificador do proxy escolhido e o número da tentativa nos dois resultados; a ordem de conclusão difere da ordem de entrada. Não escolha em segredo outro endpoint na fábrica depois de registrar um para a tarefa.

O valor de concorrência limita o trabalho deste pool. Várias tarefas que escolhem um único proxy ou conta restrita ainda podem exigir um orçamento separado para esse endpoint.

Interprete os resultados por estágio: rejeição do destino, autenticação do proxy e tempo esgotado de conexão são desfechos diferentes. As opções de envio mantidas com a tarefa mostram qual rota produziu cada resultado.

Artigos relacionados