Guzzleのボディストリームが依然としてバッファリングされる理由
ボディインターフェース、トランスポートの配信、独自のパーサーはそれぞれ独立してバッファリングできます。streamを明示的に使い、消費を漸進的に保ちましょう。
getBody() は、Guzzleがすでにレスポンスをダウンロードしていてもストリームインターフェースを返します。フォワードプロキシ経由で漸進的なネットワーク配信を要求するには、リクエストで stream を設定します:
$response = $client->request('GET', 'https://example.com/stream', [
'proxy' => 'http://proxy.example:8080',
'stream' => true,
'read_timeout' => 10,
]);
$body = $response->getBody();
これは既存のクライアントを使用します。公開HTTPエンドポイントの場合は、HTTPプロキシ一覧からアドレスを選び、例のプロキシURLを置き換えてください。ストリーミングのサポートはそのハンドラーに依存します。ストリームインターフェースだけでは、ハンドラーがボディを漸進的に配信したかどうかは分かりません。
レスポンスが届いたら、限られた部分を読み続けます。$body を文字列に変換すると、ボディ全体を再び集めてしまいます。ラインパーサーは、ネットワークのバイトが届いていても、改行を待って止まっているように見えることがあります。これらは消費の遅延なので、プロキシを変えても解消されません。
read_timeout は、サポートされているストリーム実装において個々の読み取り待ちを制限します。無限のフィードに合計10秒の寿命を与えるものではありません。タイムアウト、EOF、エラーを別々に扱い、処理が終了またはキャンセルされたらボディを閉じてください。