各 Guzzle ジョブのプロキシは、プールが開始する非同期操作に載せます。既存のクライアント設定では、プロミスファクトリを使います:

$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();

検証済みの各ジョブは宛先とプロキシを提供します。許可された公開リクエストでは、HTTP プロキシ一覧の HTTP 候補がそのジョブの認証情報不要のプロキシ URL を提供できます。選択はそのファクトリが実行される前に行われます。PSR-7 リクエストは HTTP メッセージを記述し、これらの送信オプションはトランスポートを制御します。メッセージの隣にプロキシ値を出力したり保存したりしても、別の方法で送信する操作を設定することはできません。

ファクトリから requestAsync() を返します。そこで同期の request() を呼ぶと、プールが並行作業を開始しようとしている間にブロックする可能性があります。

完了と拒否のコールバックは、アプリケーションの既存の処理を使って追加します。ジョブキー、選択したプロキシ識別子、試行番号を両方の結果に保持します。完了の順序は入力の順序とは異なります。ジョブにひとつ記録した後で、ファクトリ内で別のエンドポイントをこっそり選ばないでください。

同時実行の値はこのプールの作業量を制限します。ひとつの制約されたプロキシやアカウントを選ぶ複数のジョブは、そのエンドポイント専用の予算を別に必要とする場合があります。

結果は段階ごとに解釈します。宛先の拒否、プロキシ認証、接続のタイムアウトは別の結果です。ジョブと一緒に保持した送信オプションは、どの経路が各結果を生んだかを示します。

関連記事