Guzzle リクエストは接続スロットの待機中にタイムアウトすることがある
共有ハンドラで cURL multi のアクティブ接続の上限を設定し、アイドルキャッシュの容量と区別します。
非同期リクエストが接続を開く前に期限切れになる場合は、ネットワークのタイムアウトだけでなくトランスポートのアクティブ上限も確認してください。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_CONNECTIONS | 1 つのホスト/ポートへの接続。プロキシ接続はプロキシのエンドポイントに対して計上される |
| MAXCONNECTS | 使用後にキャッシュに保持される接続 |
同じプロキシを使う複数の Web サイトが、自動的に別々のプロキシ接続枠を受け取るわけではありません。アイドルキャッシュの容量は接続を事前に開かず、相互に交換可能にもしません。再利用は経路、宛先、プロトコル、認証に依存します。
アプリケーションのタスク予算とプロバイダの割り当てを、これらのトランスポート予算と整合させてください。これらは 1 秒あたりのリクエストではなく接続を数えます。ソケットのタイムアウトを延ばしても、キュー待ちとネットワーク待ちのどちらが時間を費やしたかは特定できません。