非同期リクエストが接続を開く前に期限切れになる場合は、ネットワークのタイムアウトだけでなくトランスポートのアクティブ上限も確認してください。libcurl はそれらの上限が埋まると転送をキューに入れ、キュー待ちの間もタイムアウトの予算は進み続けます。

Guzzle 7 の共有 cURL multi ハンドラの場合:

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlMultiHandler;

$multi = new CurlMultiHandler([
    'options' => [
        CURLMOPT_MAX_TOTAL_CONNECTIONS => 24,
        CURLMOPT_MAX_HOST_CONNECTIONS => 4,
    ],
]);
$client = new Client([
    'handler' => HandlerStack::create($multi),
]);

このクライアントを非同期処理に使い、操作に本来のプロキシオプションを指定します。値は例示的な上限です。公開された仲介者経由で許可される公開リクエストでは、HTTP プロキシ一覧が操作のプロキシ URL の候補を提供します。

オプション上限
MAX_TOTAL_CONNECTIONSマルチハンドラ配下で同時に開かれる接続
MAX_HOST_CONNECTIONS1 つのホスト/ポートへの接続。プロキシ接続はプロキシのエンドポイントに対して計上される
MAXCONNECTS使用後にキャッシュに保持される接続

同じプロキシを使う複数の Web サイトが、自動的に別々のプロキシ接続枠を受け取るわけではありません。アイドルキャッシュの容量は接続を事前に開かず、相互に交換可能にもしません。再利用は経路、宛先、プロトコル、認証に依存します。

アプリケーションのタスク予算とプロバイダの割り当てを、これらのトランスポート予算と整合させてください。これらは 1 秒あたりのリクエストではなく接続を数えます。ソケットのタイムアウトを延ばしても、キュー待ちとネットワーク待ちのどちらが時間を費やしたかは特定できません。

関連記事