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, 오류를 별도로 처리하고 처리가 끝나거나 취소되면 본문을 닫으세요.