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 在受支持的流实现下限制单次读取等待。它不会给无限输入设定十秒的总生存期。请分别处理超时、EOF 和错误,并在处理结束或取消时关闭响应体。

相关文章