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、エラーを別々に扱い、処理が終了またはキャンセルされたらボディを閉じてください。

関連記事