Por qué un flujo de cuerpo de Guzzle aún puede almacenarse en búfer
La interfaz del cuerpo, la entrega del transporte y su propio analizador pueden almacenar en búfer de forma independiente. Use stream explícitamente y mantenga el consumo incremental.
getBody() devuelve una interfaz de flujo incluso cuando Guzzle ya ha descargado la respuesta. Para solicitar una entrega de red incremental a través de un proxy directo, establezca stream en la solicitud:
$response = $client->request('GET', 'https://example.com/stream', [
'proxy' => 'http://proxy.example:8080',
'stream' => true,
'read_timeout' => 10,
]);
$body = $response->getBody();
Esto utiliza un cliente existente; para un punto de conexión HTTP público, elija una dirección de la lista de proxies HTTP y sustituya la URL de proxy del ejemplo. La compatibilidad con streaming depende de su controlador; la interfaz de flujo por sí sola no puede decirle si el controlador entregó el cuerpo de forma incremental.
Una vez que llegue la respuesta, siga leyendo porciones limitadas. Convertir $body en una cadena vuelve a reunir todo el cuerpo. Un analizador de líneas también puede parecer colgado mientras espera una nueva línea, aunque hayan llegado bytes de red. Son retrasos de consumo, así que cambiar el proxy no los eliminará.
read_timeout limita las esperas de lectura individuales bajo la implementación de flujo admitida. No da a un flujo interminable una vida total de diez segundos. Gestione el tiempo de espera, el EOF y los errores por separado, y cierre el cuerpo cuando el procesamiento termine o se cancele.